Hive 有兩種方法刪除指定parition的數據:truncate partition, drop paritionjava
功能:mysql
二者都用於刪除數據,即將對應的partition的數據文件刪除。sql
不一樣點:app
truncate 只刪除數據文件,保存在mysql中的metadata不會被刪除。spa
drop partition 只刪除數據文件且刪除在mysql中的metadata。code
舉例:string
表food的結構:it
id bigint name string
數據文件,food.data:io
1 banana 2 orange 3 apple 4 nutz
導入food.data後查詢, select * from food:class
輸出:
1 banana 20151219 2 orange 20151219 3 apple 20151219 4 nutz 20151219
如今想給food添加一列price:
ALTER TABLE food ADD COLUMNS (price int);
表結構變成:
id bigint name string price int
而且把food.data對應位置多加一列:
1 banana 20 2 orange 30 3 apple 30 4 nutz 40
刪除舊的數據(drop partition)
TRUNCATE TABLE food PARTITION (dt='20151219');
從新導入包含price信息的food.data,再查詢:
1 banana NULL 20151219 2 orange NULL 20151219 3 apple NULL 20151219 4 nutz NULL 20151219
可見,雖然表格的結構和數據文件都已經有price的信息,但導入後,hive並無識別出price這列。緣由是hive中metadata中沒有price的信息。 drop partition只是刪除數據文件,並無刪除metadata中的信息。
show partitions food 看看,輸出結果:
dt=20151219
證實truncate刪除後,分區信息尚未刪除。
用drop partition再試一次:
ALTER TABLE food DROP IF EXISTS PARTITION (dt='20151219');
這時show partitions food, 'dt=20151219' 的分區已經被刪除。
從新導入包含price信息的food.data,再查詢:
1 banana 20 20151219 2 orange 30 20151219 3 apple 30 20151219 4 nutz 40 20151219
總結:
truncate刪除分區,只刪除數據文件,parttion的信息還保留在配置的mysql中;drop partition刪除分區,數據文件和metadata一塊兒清除。
之後你們就根據實際狀況選擇使用了。