如何更新/删除Hive分区?

89
在将分区添加到 Hive外部表 后,我该如何更新/删除它?
6个回答

187

你可以通过以下方式更新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);

2
仅供参考,对于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>”。 - Marcus
这似乎是因为ORC表出现死锁了。 - MikeKulls
我收回之前的话,删除一个空分区只需要3分钟,这是Hadoop的正常表现。 - MikeKulls

20
此外,您可以在一个语句中删除多个分区(在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);

6
Alter table table_name drop partition (partition_name);

请在您的答案中添加一些解释,以便其他人可以从中学习 - 已经有其他使用不同方法的答案了。您能解释一下为什么您的看起来不同吗? - Nico Haase
这个不起作用,为什么它有这么多赞?我给它-1。 - pavel_orekhov

2
你可以将文件复制到外部分区所在的文件夹中,或使用 INSERT OVERWRITE TABLE tablename1 PARTITION (partcol1=val1, partcol2=val2...)... 语句。

2
你可能还需要激活包含表的数据库。
use [dbname]

否则您可能会遇到错误(即使指定了数据库,例如:dbname.table)

执行失败错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。无法更改分区。无法更改分区,因为表或数据库不存在。


有没有什么方法可以绕过这个问题,在spark.sql()中执行相同的操作?因为它只支持一次性执行一个命令(而且spark.sql("use <schema>")后跟着spark.sql("alter table ...")不起作用,特别是在你想要更改分区格式的情况下,这是不允许添加分区的。 - Marcus

0
除了本帖中的其他答案,对于“多个分区”,请执行以下操作。
ALTER TABLE database.table_name DROP PARTITION (partition_column >= value);

以数据库employee为例,表名为accounts,分区列为event_date,我们执行以下操作:

ALTER TABLE employee.accounts DROP PARTITION (event_date>='2023-02-25');

这将删除从2023年2月25日到当前日期的所有分区。


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