先说方案:通过show partitions和hdfs url看到的都不是真正的分区名称,都是经过URI重新编码的,访问这些分区应该使用分区名称的原始字符串。

场景描述

当我们在SQL语句中使用变量时,很可能因为操作不当,导致变量并没有被替换掉,而是被直接当作分区名称。

查看分区信息

show partitions tableA;
ymd=$%25257Benv%25253ADATE_BEFORE_1DAY}
ymd=$%257Benv%253ADATE_BEFORE_1DAY}
ymd=$%7Benv%3ADATE_BEFORE_1DAY}

删除分区

alter table tableA drop partition (ymd='$%25257Benv%25253ADATE_BEFORE_1DAY}');  # 实际未删除
alter table tableA drop partition (ymd="$%25257Benv%25253ADATE_BEFORE_1DAY}"); # 实际未删除
alter table tableA drop partition (ymd='$%257Benv%253ADATE_BEFORE_1DAY}'); # 实际删除ymd=$%25257Benv%25253ADATE_BEFORE_1DAY}
alter table tableA drop partition (ymd='$%7Benv%3ADATE_BEFORE_1DAY}'); # 实际删除ymd=$%257Benv%253ADATE_BEFORE_1DAY}

原因

分区字段中含有特殊字符时,将会被(根据URI编码规范)重新编码,所以上面show partition时看到的分区名称是经过重新编码的,删除时我们需要使用原始值。

字符 编码后
% %25
: %3A
{ %7B
# %23

所以,上面的分区原始值是

ymd=$%257Benv%253ADATE_BEFORE_1DAY}
ymd=$%7Benv%3ADATE_BEFORE_1DAY}
ymd=${env:DATE_BEFORE_1DAY}

三个分区从下往上,依次是作为分区字符串再次覆盖写入数据时,{和%被再次转义的结果。所以drop语句是

alter table tableA drop partition (ymd='$%257Benv%253ADATE_BEFORE_1DAY}');
alter table tableA drop partition (ymd='$%7Benv%3ADATE_BEFORE_1DAY}');
alter table tableA drop partition (ymd='$\{env:DATE_BEFORE_1DAY}'); # {必须被转义,否则${}会将后边的内容识别成变量

注意

  • 只需要重新编码一次,当出现连续%2525时,仅处理第一个%25,不要连续处理

查看分区对应的HDFS存储路径

DESCRIBE FORMATTED tableA PARTITION(ymd='$%257Benv%253ADATE_BEFORE_1DAY}'); # 对应 show partitions 结果ymd=$%25257Benv%25253ADATE_BEFORE_1DAY}
col_name data_type
# Detailed Partition Information NULL
Partition Value: [$%257Benv%253ADATE_BEFORE_1DAY}]
Location: hdfs://nssit/user/hive/warehouse/bs_core/tableA/ymd=$%25257Benv%25253ADATE_BEFORE_1DAY}
DESCRIBE FORMATTED tableA PARTITION(ymd='$\{env:DATE_BEFORE_1DAY}'); # 对应 show partitions 结果ymd=$%7Benv%3ADATE_BEFORE_1DAY}
col_name data_type
# Detailed Partition Information NULL
Partition Value: [${env:DATE_BEFORE_1DAY}]
Location: hdfs://nssit/user/hive/warehouse/bs_core/tableA/ymd=$%7Benv%3ADATE_BEFORE_1DAY}

最新文章

  1. php : 收集整理的非常有用的函数
  2. (4) PIVOT 和 UPIVOT 的使用
  3. JS获取阴历阳历和星期
  4. POM.xml 标签详解
  5. [转]一步一步asp.net_购物车订单与支付宝
  6. 原 iOS面试题收集
  7. 国庆去学校的国际象棋(Latex)
  8. 【Java基础】选择排序、冒泡法排序、二分法查找
  9. HDU3930(离散对数与原根)
  10. 8.5 sikuli 集成进eclipse 报错:can't be found on the disk
  11. iOS多款源码分享
  12. smack4中文文档
  13. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程
  14. 关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案
  15. python-常用数据类型
  16. 类ThreadLocal的使用与源码分析
  17. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
  18. 2017-2018-2 20155303『网络对抗技术』Exp7:网络欺诈防范
  19. Python列表split方法
  20. Java 反射(简单捋一下)

热门文章

  1. webpack优化项目
  2. mindxdl--common--errs.go
  3. 关于phalcon框架中DI的理解
  4. MySQL JDBC驱动版本与数据库版本的对应关系及注意事项
  5. Isaac SDK & Sim 环境
  6. C++编程笔记(通信)(win32平台)
  7. Java学习中实现的功能trick
  8. 【SQL进阶】【表默认值、自增、修改表列名、列顺序】Day02:表与索引操作
  9. 【企业流行新数仓】Day01:新版本对比、业务和表的介绍☆、Hive、ODS层、DWD层
  10. org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException