配置单元显示不存在的分区

时间:2018-07-30 10:39:37

标签: hive hiveql hive-metastore

我在蜂巢中有一个表,其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。但是,alternate分区DDL要求将所有分区指定为第N级。 N级是动态的,无法静态确定。

我正在通过unix脚本获取batch_id,并使用HDFS中的move命令手动移动目录。

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

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

配置单元中show show分区的输出。

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'

2 个答案:

答案 0 :(得分:0)

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

alter table test drop if exists partition (data_updated='NO');

答案 1 :(得分:0)

根据此answer,对于手动删除的分区,msck repair table不会从元存储中删除任何元数据。为此,您将必须运行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