在Impala/Hive中删除多个分区

7

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')

我遇到的错误如下:

AnalysisException: Syntax error in line 3: PARTITION (pr_load_time='20170701000831') ^ Encountered: PARTITION Expected: CACHED, LOCATION, PURGE, SET, UNCACHED CAUSED BY: Exception: Syntax error

这个分区列是bigint类型,只删除一个分区的查询可以正常工作:

ALTER TABLE cz_prd_corrti_st.s1mme_transstats_info DROP IF EXISTS
PARTITION   (pr_load_time='20170701000317')

2- 在 Impala/Hive 中,先删除 HDFS 数据再删除分区是一个好习惯吗?还是应该反过来做?

1个回答

21

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

您可以删除一个范围。
演示
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的解决方案。 - k_mishap
2
很遗憾,在Spark SQL中,分区谓词中的比较器(partition (p<=3))目前还不能正常工作,请参见https://issues.apache.org/jira/browse/SPARK-14922。 - ruhong
第二个演示与Impala 2.8+兼容。请参见https://impala.apache.org/docs/build/html/topics/impala_alter_table.html,其中写道:“在Impala 2.8及更高版本中,用于DROP或SET操作的分区子句的表达式可以包括比较运算符(如<、IN或BETWEEN)和布尔运算符(如AND和OR)。 - Michael Schaefers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接