MSCK REPAIR TABLE命令主要是用來解決通過hdfs dfs -put或者hdfs api寫入hive分區表的數據在hive中無法被查詢到的問題。
我們知道hive有個服務叫metastore,這個服務主要是存儲一些元數據信息,比如數據庫名,表名或者表的分區等等信息。如果不是通過hive的insert等插入語句,很多分區信息在metastore中是沒有的,如果插入分區數據量很多的話,你用 ALTER TABLE table_name ADD PARTITION 一個個分區添加十分麻煩。這時候MSCK REPAIR TABLE就派上用場了。只需要運行MSCK REPAIR TABLE命令,hive就會去檢測這個表在hdfs上的文件,把沒有寫入metastore的分區信息寫入metastore。
測試一下:
第一步:
CREATE TABLE test (name STRING) PARTITIONED BY (DT STRING); INSERT INTO TABLE test PARTITION(dt="20191206") VALUES ("zhang"); SHOW PARTITIONS test;
第二步:
echo "wang" > test.txt hadoop fs -mkdir -p hdfs://bigdata:8020/user/hive/warehouse/sdata.db/test/dt=20191205 hadoop fs -put -f test.txt hdfs://bigdata:8020/user/hive/warehouse/sdata.db/test/dt=20191205/
hadoop fs -ls -R hdfs://bigdata:8020/user/hive/warehouse/sdata.db/test
這個時候,我們在查看分區:
依舊還是一個分區在,查詢表的數據,還是一樣的的。
在Hive中執行:
msck repair table test
結果顯示:
select * from test;
看來是可以的。增加新分區到表中。
然后,如果我刪除20191205的分區在hdfs上:
hadoop fs -rm -r hdfs://bigdata:8020/user/hive/warehouse/sdata.db/test/dt=20191205
執行:
MSCK REPAIR TABLE TEST
SHOW PARTITIONS TEST
查看分區還是有 20191205 20191206兩天的分區,但是表里的數據只有一天的了。看來,這個命令只能獲取新增的分區信息,針對於刪除的分區,無法及時更新。
問題:
分區數據沒有,但是分區存在,尚未解決。無法統一。
--眼睛太疼了,難受的不行。。。。。。。。