我在 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'