Hive中Partition Overwrite问题及分区表数据追加实现咨询
Hive分区表数据加载与追加问题解答
嘿,我来帮你把这个Hive分区表的问题讲明白~
一、加载后的数据结果(分两种操作场景)
场景1:不小心用了覆盖式加载(容易踩的坑)
如果你用了INSERT OVERWRITE或者带OVERWRITE参数的LOAD DATA命令,Hive会直接清空目标分区的所有原有数据,再写入新数据。这种情况下,Jan分区会被完全覆盖,最终表数据变成这样:
| date_created | value |
|---|---|
| Jan | z |
| Feb | a |
| Feb | b |
场景2:用了正确的追加式加载
如果选择了追加操作,新数据会被添加到对应分区的现有数据后面,不会覆盖原有内容。最终表的完整数据是:
| date_created | value |
|---|---|
| Jan | a |
| Jan | b |
| Jan | c |
| Jan | z |
| Feb | a |
| Feb | b |
二、Hive中实现数据追加、避免分区覆盖的方法
和RDBMS里INSERT默认就是追加不同,Hive的分区是基于文件系统(比如HDFS)的独立目录存储的,所以得选对操作方式:
1. 使用INSERT INTO语句(Hive 0.14及以上版本支持)
这是最直观的追加方式,语法和RDBMS的INSERT很像,会自动把数据追加到对应分区,完全不会碰原有数据:
-- 直接插入指定值 INSERT INTO TABLE your_table PARTITION(date_created) VALUES ('Feb', 'a'), ('Feb', 'b'), ('Jan', 'z'); -- 从其他表/视图批量加载数据 INSERT INTO TABLE your_table PARTITION(date_created) SELECT date_created, value FROM your_new_data_table;
2. 使用不带OVERWRITE的LOAD DATA命令
LOAD DATA的默认行为就是追加数据到对应分区,只有加上OVERWRITE参数才会替换整个分区的内容:
-- 从本地文件系统加载数据(带LOCAL关键字) LOAD DATA LOCAL INPATH '/your/local/data/file/path' INTO TABLE your_table PARTITION(date_created); -- 从HDFS上加载数据 LOAD DATA INPATH '/hdfs/data/file/path' INTO TABLE your_table PARTITION(date_created);
核心原理提醒
Hive的每个分区对应HDFS上的一个独立目录,OVERWRITE操作会直接清空这个目录再写入新文件;而INSERT INTO或者不带OVERWRITE的LOAD DATA,只是把新的数据文件添加到对应分区目录下,查询时Hive会自动合并该目录下所有文件的数据。
内容的提问来源于stack exchange,提问作者Dileep Dominic
相关产品推荐
相关产品推荐

