1

我在 hive 中有一张表,其 DDL 如下所示:

CREATE TABLE test(id string) PARTITIONED BY (data_updated string,batch_id string,country string,state string);

data_updated=NO/batch_id=102/country='1'/state='A';
data_updated=NO/batch_id=103/country='2'/state='B';
data_updated=NO/batch_id=104/country='3'/state='C';

我想将数据从 data_updated=NO 移动到 data_updated=YES。我通过 HDFS 命令来做到这一点。

data_updated=YES/batch_id=102/country='1'/state='A'
data_updated=YES/batch_id=103/country='2'/state='B'
data_updated=YES/batch_id=104/country='3'/state='C'

一种选择是编写多个重命名分区 DDL。但是,alter partition DDL 要求将所有分区指定到第 N 级。N级是动态的,不能静态确定。

我在 unix 脚本的帮助下获取 batch_ids,并使用 HDFS 中的 move 命令手动移动目录。

Inside a loop:
hadoop fs -mv /table/directory/data_processed=NO/batch_id=$i /table/directory/data_processed=YES/

使用 HDFS 命令移动的问题是在 hive 中修复表后,不存在的分区仍然存在于 hive 元数据中。如何从配置单元元数据中删除不存在的分区。有什么建议么?

hive 中显示分区的输出。

show partitions test;

data_updated=NO/batch_id=102/country='1'/state='A'; # NON-EXISTING
data_updated=NO/batch_id=103/country='2'/state='B'; # NON-EXISTING
data_updated=NO/batch_id=104/country='3'/state='C'; # NON-EXISTING
data_updated=YES/batch_id=102/country='1'/state='A'
data_updated=YES/batch_id=103/country='2'/state='B'
data_updated=YES/batch_id=104/country='3'/state='C'
4

2 回答 2

1

我的理解是,Hive 无法根据丢失的 hdfs 目录删除分区。我看到的最简单的方法是根据这样的条件删除分区

alter table test drop if exists partition (data_updated='NO');
于 2018-07-30T12:59:45.947 回答
1

根据这个答案msck repair table对于手动删除的分区,不会从 Metastore 中删除任何元数据。为此,您必须运行alter table drop partition (...)以更新元数据。

由于您的分区是动态生成的,我建议您编写一个脚本来运行alter table命令,而不是手动运行它们。例如:

for path in $(hive -e "show partitions test" | grep "data_updated=NO")
do
  part=$(echo $path | tr "/" " ")
  echo "alter table test drop partitions($(echo $part | tr " " ","));"
done > drop_partitions.hql
于 2018-07-30T13:22:50.837 回答