ZhangZhihui's Blog  

1. INSERT

情况 1:INSERT OVERWRITE

  • 覆盖分区目录或表目录中的旧文件,并写入新文件。

  • Hive 会先把查询结果写到一个临时目录,然后替换掉原目录。

  • HDFS 中原有的文件会被删除(实际上是放到 HDFS 回收站,如果开启了的话)。

📂 HDFS 效果示例

插入前:
/warehouse/sales/month=2020-01/part-00000

INSERT OVERWRITE TABLE sales PARTITION(month='2020-01') ...
插入后:
/warehouse/sales/month=2020-01/000000_0   (新文件)

 


情况 2:INSERT INTO

  • 追加新文件到分区目录,不会删除原文件。

  • 查询时,Hive 会同时读取原文件和新追加的文件。

📂 HDFS 效果示例

插入前:
/warehouse/sales/month=2020-01/part-00000

INSERT INTO TABLE sales PARTITION(month='2020-01') ...
插入后:
/warehouse/sales/month=2020-01/part-00000
/warehouse/sales/month=2020-01/part-00001   (新追加文件)

 


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 表)

/warehouse/sales/month=2020-01/base_0000000      (原始数据)
/warehouse/sales/month=2020-01/delta_0000001_0000001  (删除标记)
/warehouse/sales/month=2020-01/delta_0000002_0000002  (新数据)

 


🔍 总结表

操作非事务表ACID 事务表
INSERT OVERWRITE 覆盖文件 覆盖文件
INSERT INTO 新增文件 新增文件
DELETE 不支持(需重写表) 生成删除标记文件,合并时物理删除

 

UPDATE 在 Hive 里和 DELETE 一样,只有在 ACID 事务表 中才真正支持,而且它对 HDFS 上文件的影响也和传统数据库完全不同。


1. 非事务表(默认 Text/Parquet/ORC 无事务)

  • 不支持直接 UPDATE

  • 如果你想改数据,只能用:

    1. INSERT OVERWRITE 写一个新文件,替换旧文件;

    2. 或者在外部系统(Spark、MapReduce)处理后再覆盖表数据。

  • 本质还是整文件重写,没有“就地更新”。


2. ACID 事务表(transactional=true 且存储格式支持 ORC)

  • Hive 会将 UPDATE 转换成:

    • 一条删除标记(delete delta)

    • 一条新数据(insert delta)

  • HDFS 中的原文件不会被直接修改,而是新增增量文件(delta)。

  • 只有执行 Major Compaction 后,才会把旧数据和新数据合并成新的 base 文件,并删除旧文件。

📂 HDFS 文件变化示例
假设原文件:

/warehouse/sales/month=2020-01/base_0000000 (原始数据)

执行:

UPDATE sales SET amount = 500 WHERE id = 3 AND month = '2020-01';

结果 HDFS 目录会多两个文件:

 
/warehouse/sales/month=2020-01/delta_0000001_0000001/delete_event_0000001
/warehouse/sales/month=2020-01/delta_0000001_0000001/insert_event_0000001

数据读取时,Hive 会合并 base 文件和 delta 文件,屏蔽已删除的旧版本。


🔍 总结:UPDATE/DELETE 在 Hive 中的本质

    • 非 ACID 表:不支持,等同于手动全表或分区覆盖(INSERT OVERWRITE)。

    • ACID 表:采用 MVCC + delta 文件,原文件不直接改,数据更新会生成新文件;只有合并(Compaction)才会物理替换。

 

我帮你画一张 Hive ACID 表中 INSERT / UPDATE / DELETE 文件变化示意图,让你直观理解数据是如何在 HDFS 里增量变化的。


Hive ACID 表文件变化示意图

初始状态:
/warehouse/sales/month=2020-01/
    └── base_0000000            (初始完整数据文件)

执行 INSERT:
    └── base_0000000
    └── delta_0000001_0000001   (新增数据文件)

执行 UPDATE:
    └── base_0000000
    └── delta_0000001_0000001
        ├── delete_event_0000001   (被更新数据的删除标记)
        └── insert_event_0000001   (更新后新数据)

执行 DELETE:
    └── base_0000000
    └── delta_0000001_0000001
        └── delete_event_0000001   (被删除数据的删除标记)

Major Compaction 后:
    └── base_0000002             (合并后包含最新数据的完整文件)
    (旧的 base 和 delta 文件被删除)

 


说明

  • base 文件:全量数据快照。

  • delta 文件:增量数据,包括插入和删除标记。

  • Hive 查询时会合并 base 和 delta,展现最新的数据视图。

  • Major Compaction 是后台任务,合并小文件、清理历史文件,提高查询性能。

 

posted on 2025-08-12 10:38  ZhangZhihuiAAA  阅读(94)  评论(0)    收藏  举报