一、背景
我们平时一般使用:
alter table ${TABLE_NAME} add partition (dt=‘2019-11-11’);
alter table ${TABLE_NAME} drop partition (dt=‘2019-11-11’);
方式增删Hive的分区的.
但有时候会通过以下方式进行数据的录入:
HDFS put/cp命令往表目录下拷贝分区目录,如果目录多,需要执行多条alter语句,非常麻烦。 Sqoop 或 Kettle将数据直接导入至hdfs目录下, 如: /user/hive/warehouse/ods.db/ods_${TABLE_NAME}因数据直接导入至分区所在位置, 而分区信息并未存储在metastore中, 则无论是对表查询分区list信息, 或是查分区中数据, 都无法查询到.
对于这类问题, Hive提供了一个"Recover Partition"的功能。
具体语法如下:
MSCK REPAIR TABLE table_name;
其执行原理为:
执行该命令后,Hive会检测如果HDFS目录下存在但表的metastore中不存在的partition元信息,更新到metastore中。
二、测试
#当前没有partition元信息hive> show partitions ${TABLE_NAME};OKTime taken: 0.104 seconds#创建两个分区目录hive> dfs -mkdir /user/hive/warehouse/${TABLE_NAME}/dt=2019-11-11;hive> dfs -mkdir /user/hive/warehouse/${TABLE_NAME}/dt=2019-11-12;#使用MSCK修复分区hive> msck repair table ${TABLE_NAME};OKPartitions not in metastore:${TABLE_NAME}:dt=2019-11-11Partitions not in metastore:${TABLE_NAME}:dt=2019-11-12Repair: Added partition to metastore ${TABLE_NAME}:dt=2019-11-11Repair: Added partition to metastore ${TABLE_NAME}:dt=2019-11-12Time taken: 0.286 seconds, Fetched: 2 row(s)#再检查可以发现, 已经成功更新元信息hive> show partitions ${TABLE_NAME};OKdt=2019-11-11dt=2019-11-12Time taken: 0.102 seconds, Fetched: 1 row(s) 相关JIRA:HIVE-874https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL