【问题标题】:How to update partition metadata in Hive , when partition data is manualy deleted from HDFS当从 HDFS 手动删除分区数据时,如何更新 Hive 中的分区元数据
【发布时间】:2014-02-02 04:48:08
【问题描述】:

Hive分区表元数据自动更新的方法是什么?

如果新的分区数据被添加到 HDFS(没有执行 alter table add partition 命令)。然后我们可以通过执行“msck repair”命令来同步元数据。

如果从HDFS中删除了大量分区数据该怎么办(没有执行alter table drop partition commad执行)。

同步 Hive 元数据的方法是什么?

【问题讨论】:

    标签: hive partitioning


    【解决方案1】:

    编辑:从 Hive 3.0.0 开始,MSCK 现在可以使用以下语法发现新分区或删除丢失的分区(或两者):

    MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]
    

    这是在HIVE-17824中实现的


    正如HakkiBuyukcengiz 所说,MSCK REPAIR 不会在手动删除 HDFS 上的相应文件夹时删除分区,它只会在创建新文件夹时添加分区

    摘自官方documentation

    换句话说,它会将 HDFS 上存在但不在 Metastore 中的任何分区添加到 Metastore。

    如果在 HDFS 上手动删除多个分区文件夹并且我想快速刷新分区,我通常会在存在 external 表的情况下这样做:

    • 放下桌子 (DROP TABLE table_name) (删除外部表不会删除底层分区文件)
    • 重新创建表 (CREATE EXTERNAL TABLE table_name ...)
    • 修复它 (MSCK REPAIR TABLE table_name)

    根据分区的数量,这可能需要很长时间。另一种解决方案是为每个已删除的分区文件夹使用ALTER TABLE DROP PARTITION (...),但如果删除了多个分区,这可能会很乏味。

    【讨论】:

    • 如果表是MANAGED_TABLE怎么办?
    • @Nanor MSCK 命令也会处理托管表分区。
    • 感谢这个解决方案的帮助......放下桌子并重新创建!
    【解决方案2】:

    尝试使用

    MSCK REPAIR TABLE <tablename>;
    

    【讨论】:

    • Msck 不会删除文件系统中不存在目录的分区。它只通知文件系统中不存在哪些分区的目录。您应该手动运行“alter table drop partition..”
    【解决方案3】:

    确保表设置为外部,删除所有分区然后运行表修复:

    alter table mytable_name set TBLPROPERTIES('EXTERNAL'='TRUE')
    alter table mytable_name drop if exists partition (`mypart_name` <> 'null');
    msck repair table mytable_name;
    


    如果 msck repair 抛出错误,则从终端运行 hive:
    hive --hiveconf hive.msck.path.validation=ignore
    set hive.msck.path.validation=ignore;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      相关资源
      最近更新 更多