删除 hive 分区外部表但保留分区

Posted

技术标签:

【中文标题】删除 hive 分区外部表但保留分区【英文标题】:delete hive partitioned external table but retain partitions 【发布时间】:2017-03-28 13:45:27 【问题描述】:

使用外部配置单元表时,有没有一种方法可以删除目录中的数据,但通过查询保留分区。请注意,我不想删除表并重新创建它。我只想清空底层文件夹并重新开始一个过程。我的表很大,按年、月、日和小时进行分区,手动重新创建分区需要很长时间。

谢谢

【问题讨论】:

在shell中写一个循环并删除分区文件夹中的文件。 这就是我所做的,很想知道是否有一个查询可以做到这一点。 没有这样的查询 afaik。删除分区将从元数据中删除分区,而不是文件,插入覆盖分区无论如何都不是有效的。删除文件很有效。 如何删除数据?我认为hdfs dfs -rm -r mytable/year=*/month=*/date=*/* 应该可以工作 @leftjoin - 检查我的答案 【参考方案1】:

truncate table ... 删除所有数据。truncate table partition (...) 删除特定分区的数据。

目录结构被保留。


应先将外部表转换成manged,.e.g

alter table t set tblproperties('EXTERNAL'='FALSE');

完成后,我们可以将其转换回来

alter table t set tblproperties('EXTERNAL'='TRUE');

演示

create table t (i int) partitioned by (x char(1));
set hive.exec.dynamic.partition.mode=nonstrict;
insert into t partition (x) values (1,'A'),(2,'B'),(3,'C');
alter table t set tblproperties('EXTERNAL'='TRUE');

select * from t;

+-----+-----+
| t.i | t.x |
+-----+-----+
|   1 | A   |
|   2 | B   |
|   3 | C   |
+-----+-----+

dfs -ls -R /user/hive/warehouse/t;

drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=A
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=A/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=B
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=B/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=C
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=C/000000_0

truncate table t partition (x='B');

失败:SemanticException [错误 10146]:无法截断非托管 表 t。

alter table t set tblproperties('EXTERNAL'='FALSE');

truncate table t partition (x='B');

select * from t;

+-----+-----+
| t.i | t.x |
+-----+-----+
|   1 | A   |
|   3 | C   |
+-----+-----+

dfs -ls -R /user/hive/warehouse/t;

drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=A
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=A/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:42 /user/hive/warehouse/t/x=B
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=C
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=C/000000_0

truncate table t;

+-----+-----+
| t.i | t.x |
+-----+-----+

dfs -ls -R /user/hive/warehouse/t;

drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=A
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=B
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=C

alter table t set tblproperties('EXTERNAL'='TRUE');

【讨论】:

嘟嘟,外表问题。 @franklinsijo,我会检查一下,但这不是问题,因为我们可以将外部更改为 manged,反之亦然。 @David דודו Markovitz - 很好.. 我们不需要在此操作后运行 msck repair。 @vikrantrana - 没必要。 truncate table 适用于文件级别(删除文件),而msck repair table 适用于目录级别(查找现有文件夹和已定义分区之间的间隙)

以上是关于删除 hive 分区外部表但保留分区的主要内容,如果未能解决你的问题,请参考以下文章

从 hive 外部表中的分区中删除列

从 hdfs 中删除文件是不是会删除相应的 hive 外部表分区?

从 Hive 分区外部表中删除特定列

Hive管理表,外部表及外部分区表的深入探讨

Hive内部表、外部表、分区表、桶表概述

Hive关于内部表外部表以及分区表数据删除总结