当分区数据从HDFS手动删除时,如何在配置单元中更新分区元数据



如何自动更新配置单元分区表的元数据?

如果将新的分区数据添加到HDFS中(不执行alter表添加分区命令)。然后我们可以通过执行命令"msck repair"来同步元数据。

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

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

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

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

这在HIVE-17824 中实现


正如HakkiBuyukcengiz正确指出的那样,如果HDFS上的相应文件夹被手动删除,MSCK REPAIR不会删除分区,它只会在创建新文件夹时添加分区。

官方文件摘录:

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

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

  • 删除表(DROP TABLE table_name)(删除外部表不会删除基础分区文件)
  • 重新创建表(CREATE EXTERNAL TABLE table_name ...)
  • 修复(MSCK REPAIR TABLE table_name)

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

尝试使用

MSCK REPAIR TABLE <tablename>;

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

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修复抛出错误,则从终端运行配置单元,如下所示:
hive --hiveconf hive.msck.path.validation=ignore
set hive.msck.path.validation=ignore;

最新更新