应用场景
如果事先建立了一张分区表,然后手动(比如使用 cp 或者 mv )将分区数据拷贝到刚刚新建的表进行数据初始化;但是对于分区表,需要在hive里面手动将刚刚初始化的数据分区加入到hive里面,这样才能够查询使用。通常的做法是使用 alter table add partition命令手动添加分区;但是如果初始化的分区太多,这样一条一条地手动添加分区不免过于麻烦(虽然可以写个脚本生成添加分区的命令),其实另一个场景类似,就是假如有分析人员误删除了分区表(发现的很及时,还没有被hdfs的垃圾回收),这时候就可通过重新创建分区表,然后把数据从Trash中mv到新表的位置。;
命令
msck repair table + tableName
执行后,Hive会检测如果HDFS目录下存在但表的metastore中不存在的partition元信息,更新到metastore中。
样例说明
- 建表
CREATE TABLE `test_partition`(
`datehour` string,
`halfhourtype` string,
`uid` string,
`roomid` string,
`roomcreatoruid` string,
`staytime` string)
PARTITIONED BY (
`pt_day` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://nameservice1/user/hive/warehouse/test_partition'
- 查看表分区信息
hive> show partitions test_partition;
OK
Time taken: 0.048 seconds
- 从其他地方复制数据到指定的目录
hadoop fs -cp /user/hive/.Trash/Current/user/hive/warehouse/test_partition/pt_day=2018-07-10 /user/hive/warehouse/test_partition/
hadoop fs -cp /user/hive/.Trash/Current/user/hive/warehouse/test_partition/pt_day=2018-07-11 /user/hive/warehouse/test_partition/
hadoop fs -cp /user/hive/.Trash/Current/user/hive/warehouse/test_partition/pt_day=2018-07-12 /user/hive/warehouse/test_partition/
- 执行修复命令
hive> MSCK REPAIR TABLE test_partition;
OK
Partitions not in metastore: test_partition:pt_day=2018-07-10 test_partition:pt_day=2018-07-11 test_partition:pt_day=2018-07-12
Repair: Added partition to metastore test_partition:pt_day=2018-07-10
Repair: Added partition to metastore test_partition:pt_day=2018-07-11
Repair: Added partition to metastore test_partition:pt_day=2018-07-12
Time taken: 0.133 seconds, Fetched: 3 row(s)
- 查看分区信息
hive> show partitions test_partition;
OK
pt_day=2018-07-10
pt_day=2018-07-11
pt_day=2018-07-12
Time taken: 0.039 seconds, Fetched: 3 row(s)
重点注意
- 如果复制过去的数据的目录格式不对,将不能完成分区修复,会报出code1错误;
hive> MSCK REPAIR TABLE test_portition;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
- 为了让MSCK命令工作,分区的目录名必须是【/partition_name=partition_value/】结构的(且表级目录中不得存在非此种格式的目录名),否则将无法添加分区。这时候就必须使用add partition命令了。