非分區表
複製表結構
create table new_table like exists_table;
複製表結構和數據
create table new_table as select * from exists_table;
分區表
複製表結構
create table new_table like exists_table;
複製數據稍微麻煩點,使用hdfs拷貝文件,然後再修復表數據。
首先,hadoop fs - cp 命令將exists_table舊錶的數據拷貝到new_table新表
hadoop fs -cp /user/warehouse/test.db/exists_table/* /user/warehouse/test.db/new_table/
然後執行MSCK REPAIR TABLE new_table
命令讓兩張表的分區元數據保持一致
注意
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
但是用hdfs dfs -rmr
刪除hive分區表的hdfs文件會出現問題,hdfs上的文件雖然刪除了,但是hive metastore中的元數據信息沒有刪除,在查詢全表等操作時會報錯,使用show parttions table_name
這些分區信息還在,說明MSCK REPAIR TABLE
這個命W無法刪除已經不存在hdfs上的表分區信息,hive 2.4.0以後的版本增加了清理metastore中已經不在hdfs上的分區信息這個功能。目前的版本只能手動清除分區信息嘍。