我在蜂巢中有一个表,其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'
答案 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