【Hive】删除含有特殊符号的分区

(Hive版本0.14)

一、问题描述

由于操作失误,生成了一些含有特殊字符的分区,如:

-- 1.插入数据
insert overwirte table test partition(dt)
select col, '%(data_date)s' as dt
from src_test;

-- 2.查看分区
show partitions test;
dt=%25(data_date)s
dt=2020-08-10
dt=2020-08-01
...

当尝试删除它们的时候,发现怎么也不奏效:

-- 尝试1
alter table test drop partition(dt='%25(data_dt)s');
-- 尝试2
set hivevar:temp=%25(data_dt)s;
alter table test drop partition(dt='{temp}');

二、解决方案

1.主要问题

(1)分区值格式:Hive分区对应Hdfs中的文件目录,因此分区值格式必须符合Hdfs路径格式(Java的URI)。当URI中有特殊字符时(如,'%',':','/','#'),将以其转义编码存储。(%+2个字节的ASDII值),如:

字符 URI编码值
 %25
%3A
/ %2F
# %23

(2)语法:在使用以下语法时,当Client输入原始特殊字符时,Hive会返回其转义编码(具体原理待查):

SHOW PARTITIONS table_name [PARTITION(partition_spec)];
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec;

2.解决

针对于此,直接传入原始值即可删除:

alter table test drop partition(dt='%(data_date)s');

 

【参考】

1.Cannot drop Hive partition with control characters in partition name?

https://community.cloudera.com/t5/Support-Questions/Cannot-drop-Hive-partition-with-control-characters-in/td-p/98137

2.Dynamic-Partition Insert

https://cwiki.apache.org/confluence/display/Hive/Tutorial

你可能感兴趣的:(数据库)