Hive的msck repair修复分区

[MSCK REPAIR TABLE] 命令全量修复分区,目的就是将分区信息更新到元数据库中

案例一:

常用于手动复制目录到hive表的location下,此时Hive元数据中没有记录到该目录是hive的分区,所以查不到该分区数据。
表test_tbl,存储路径为/user/hive/warehouse/test_tbl,分区字段为pt,正常添加分区是这样的:

alter table add if not exist partition (pt='20190101');

然后在hdfs中表的存储目录下会生成分区目录/user/hive/warehouse/test_tbl/pt=20190101,此时无论是往该目录新增数据文件还是往hive中insert数据,之后都可以在hive中查到该分区的数据。

但如果直接将一个文件夹名为pt=20190201的上传至hdfs的/user/hive/warehouse/test_tbl/路径下,在hive中是查不到分区pt='20190201’的数据的,就如前面所说,hive的metadata中没有记录到分区20190201这个分区,因此需要执行msck repair table命令修复。

案例二:

此命令也常用于distcp数据之后修复表分区。
例如从CDH迁移到HDP环境,HDFS文件已经迁移到HDP的HDFS目录,但是在HDP环境中的hive未查到数据,就需要进行分区修复。


/* 移动HDFS位置 */
hdfs dfs -cp /cdhtest/dw_om_actual_sales_f_crm_bak/dw_om_actual_sales_f_crm_bak/*  /apps/hive/warehouse/dw.db/dw_om_actual_sales_f_crm_bak

-- 查询数据显示为0
select count(*) from dw.dw_om_actual_sales_f_crm_bak

/* 修复多层分区 */
set hive.msck.path.validation=ignore;
MSCK REPAIR TABLE dw.dw_om_actual_sales_f_crm_bak;

-- 查询数据后有数据
select count(*) from dw.dw_om_actual_sales_f_crm_bak

你可能感兴趣的:(Hive)