在 Impala/Hive 中删除多个分区
Posted
技术标签:
【中文标题】在 Impala/Hive 中删除多个分区【英文标题】:Dropping multiple partitions in Impala/Hive 【发布时间】:2017-08-07 09:18:41 【问题描述】:1- 我试图一次删除多个分区,但使用 Impala 或 Hive 都很难做到。我尝试了以下查询,有无'
:
ALTER TABLE cz_prd_corrti_st.s1mme_transstats_info DROP IF EXISTS
PARTITION (pr_load_time='20170701000317')
PARTITION (pr_load_time='20170701000831')
我得到的错误如下:
分析异常: 第 3 行中的语法错误:PARTITION (pr_load_time='20170701000831') ^ 遇到:PARTITION 预期:CACHED、LOCATION、PURGE、SET、 未缓存原因:异常:语法错误
分区列是bigint类型,只删除一个分区的查询按预期工作:
ALTER TABLE cz_prd_corrti_st.s1mme_transstats_info DROP IF EXISTS
PARTITION (pr_load_time='20170701000317')
2- 最好先删除 hdfs 数据,然后在 Impala/Hive 中删除分区,还是反之亦然?
【问题讨论】:
【参考方案1】:1.
您的语法错误。 在 DROP 命令中,分区应该用逗号分隔。
演示
hive> create table t (i int) partitioned by (p int);
OK
hive> alter table t add partition (p=1) partition(p=2) partition(p=3) partition(p=4) partition(p=5);
OK
hive> show partitions t;
OK
partition
p=1
p=2
p=3
p=4
p=5
hive> alter table t drop if exists partition (p=1),partition (p=2),partition(p=3);
Dropped the partition p=1
Dropped the partition p=2
Dropped the partition p=3
OK
hive> show partitions t;
OK
partition
p=4
p=5
2.
你可以删除一个范围。
演示
hive> create table t (i int) partitioned by (p int);
OK
hive> alter table t add partition (p=1) partition(p=2) partition(p=3) partition(p=4) partition(p=5);
OK
hive> show partitions t;
OK
partition
p=1
p=2
p=3
p=4
p=5
hive> alter table t drop if exists partition (p<=3);
Dropped the partition p=1
Dropped the partition p=2
Dropped the partition p=3
OK
hive> show partitions t;
OK
partition
p=4
p=5
【讨论】:
您确实是正确的,Hive 使用上述语法。尚未找到 Impala 的解决方案。 不幸的是,分区谓词 (partition (p<=3)
) 中的比较器在 Spark SQL 中不起作用,请参阅issues.apache.org/jira/browse/SPARK-14922
第二个演示适用于 Impala 2.8+。请参阅impala.apache.org/docs/build/html/topics/…,其中说“在 Impala 2.8 及更高版本中,具有 DROP 或 SET 操作的分区子句的表达式可以包括比较运算符,如
以上是关于在 Impala/Hive 中删除多个分区的主要内容,如果未能解决你的问题,请参考以下文章
在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL
如何在没有 ClassNotFound 异常的情况下在 Apache Tomcat 中配置 Impala/Hive2 JDBC 驱动程序