Hive 有两种方法删除指定parition的数据:truncate partition, drop parition
功能:
两者都用于删除数据,即将对应的partition的数据文件删除。
不同点:
truncate 只删除数据文件,保存在mysql中的metadata不会被删除。
drop partition 只删除数据文件且删除在mysql中的metadata。
举例:
表food的结构:
id bigint
name string
数据文件,food.data:
1 banana
2 orange
3 apple
4 nutz
导入food.data后查询, select * from food:
输出:
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一起清除。
以后大家就根据实际情况选择使用了。
来源:oschina
链接:https://my.oschina.net/u/942558/blog/547967