Hive - truncate partition、drop partition 區別

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一塊兒清除。

之後你們就根據實際狀況選擇使用了。

相關文章
相關標籤/搜索