【问题标题】:Hive showing non-existing partitionsHive 显示不存在的分区
【发布时间】:2019-01-06 14:17:30
【问题描述】:

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

【问题讨论】:

    标签: hive hiveql hive-metastore


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      根据answermsck 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多