如何更新/删除配置单元分区?


75

将分区添加到Hive中外部表后,如何更新/删除它?

Answers:


164

您可以通过以下方式更新Hive分区:

ALTER TABLE logs PARTITION(year = 2012, month = 12, day = 18) 
SET LOCATION 'hdfs://user/darcy/logs/2012/12/18';

此命令不会移动旧数据,也不会删除旧数据。它只是将分区设置为新位置。

要删除分区,您可以执行

ALTER TABLE logs DROP IF EXISTS PARTITION(year = 2012, month = 12, day = 18);

希望能帮助到你!


1
仅供参考,对于Spark SQL,这也将无法更新现有分区的位置,主要是因为Spark SQL API不支持它。同样从Hive CLI,您需要首先运行use <schema>,否则FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter partition. Unable to alter partitions because table or database does not exist.即使表确实存在,也会失败。因此,如果表名称为<schema>.<table>,则必须先从CLI中运行,use <schema>然后才能更改分区位置。
马库斯

这似乎永远悬挂在ORC桌子上
MikeKulls

我收回这一点,只需3分钟即可删除一个空分区。正常的Hadoop性能。
MikeKulls

15

此外,您可以从一个语句删除多个分区(在Impala / Hive中删除多个分区)。

从上面的链接中提取:

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

编辑1:

另外,您可以使用条件符号(>,<,<>)来批量删除,例如:

Alter table t 
drop partition (PART_COL>1);

2

您可以将文件复制到外部分区所在的文件夹中,也可以使用

INSERT OVERWRITE TABLE tablename1 PARTITION (partcol1=val1, partcol2=val2...)...

声明。


2

您可能还需要使包含表的数据库处于活动状态

use [dbname]

否则,您可能会出错(即使您指定了数据库,即dbname.table)

FAILED Execution Error,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。无法更改分区。由于表或数据库不存在,因此无法更改分区。


不知道是否有一种解决方法可用于在中执行相同的操作spark.sql(),该操作一次仅支持一个命令(spark.sql("use <schema>")随后是spark.sql("alter table ...")不起作用,尤其是在您想要更改添加中不允许的分区格式的情况下)分区
Marcus

2
Alter table table_name drop partition (partition_name);

请在您的答案中添加一些解释,以便其他人可以从中学习-使用其他方法已经存在其他答案。您能解释一下为什么您的外表不同吗?
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.