1. INSERT
情况 1:INSERT OVERWRITE
-
会覆盖分区目录或表目录中的旧文件,并写入新文件。
-
Hive 会先把查询结果写到一个临时目录,然后替换掉原目录。
-
HDFS 中原有的文件会被删除(实际上是放到 HDFS 回收站,如果开启了的话)。
📂 HDFS 效果示例
情况 2:INSERT INTO
-
会追加新文件到分区目录,不会删除原文件。
-
查询时,Hive 会同时读取原文件和新追加的文件。
📂 HDFS 效果示例
2. DELETE
Hive 的 DELETE 要分两种引擎情况来看:
情况 1:非 ACID 表(默认 Text/Parquet/ORC 无事务)
-
不支持直接
DELETE,只能用INSERT OVERWRITE重新写入需要保留的数据。 -
所以删除操作本质是生成新文件替换旧文件,HDFS 旧文件被删除。
情况 2:ACID 表(事务表,ORC + transactional=true)
-
Hive 会生成新的版本文件,并标记旧数据为已删除(Delta 机制)。
-
旧数据文件仍然在 HDFS 里,直到做 Major Compaction 才会物理删除。
📂 HDFS 效果示例(ACID 表)
🔍 总结表
| 操作 | 非事务表 | ACID 事务表 |
|---|---|---|
| INSERT OVERWRITE | 覆盖文件 | 覆盖文件 |
| INSERT INTO | 新增文件 | 新增文件 |
| DELETE | 不支持(需重写表) | 生成删除标记文件,合并时物理删除 |
UPDATE 在 Hive 里和 DELETE 一样,只有在 ACID 事务表 中才真正支持,而且它对 HDFS 上文件的影响也和传统数据库完全不同。
1. 非事务表(默认 Text/Parquet/ORC 无事务)
-
不支持直接
UPDATE。 -
如果你想改数据,只能用:
-
先
INSERT OVERWRITE写一个新文件,替换旧文件; -
或者在外部系统(Spark、MapReduce)处理后再覆盖表数据。
-
-
本质还是整文件重写,没有“就地更新”。
2. ACID 事务表(transactional=true 且存储格式支持 ORC)
-
Hive 会将
UPDATE转换成:-
一条删除标记(delete delta)
-
一条新数据(insert delta)
-
-
HDFS 中的原文件不会被直接修改,而是新增增量文件(delta)。
-
只有执行 Major Compaction 后,才会把旧数据和新数据合并成新的 base 文件,并删除旧文件。
📂 HDFS 文件变化示例
假设原文件:
执行:
结果 HDFS 目录会多两个文件:
数据读取时,Hive 会合并 base 文件和 delta 文件,屏蔽已删除的旧版本。
🔍 总结:UPDATE/DELETE 在 Hive 中的本质
-
非 ACID 表:不支持,等同于手动全表或分区覆盖(
INSERT OVERWRITE)。 -
ACID 表:采用 MVCC + delta 文件,原文件不直接改,数据更新会生成新文件;只有合并(Compaction)才会物理替换。
我帮你画一张 Hive ACID 表中 INSERT / UPDATE / DELETE 文件变化示意图,让你直观理解数据是如何在 HDFS 里增量变化的。
Hive ACID 表文件变化示意图
说明
-
base 文件:全量数据快照。
-
delta 文件:增量数据,包括插入和删除标记。
-
Hive 查询时会合并 base 和 delta,展现最新的数据视图。
-
Major Compaction 是后台任务,合并小文件、清理历史文件,提高查询性能。

浙公网安备 33010602011771号