订阅更新

Hive也能做UPDATE和DELETE了?事务表怎么用?

Hive手册 第 14 题 约 4 分钟读完

本文目录
  1. 先说结论
  2. 使用前提
  3. 生产环境为什么很少用?
  4. 那什么场景会用Hive ACID?
  5. 总结

先说结论

Hive ACID是个“知道就行,但生产环境优先用Delta Lake/Iceberg”的功能。原因是限制太多、性能太差。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

Hive 3.0开始支持ACID事务,可以做UPDATE、DELETE、MERGE INTO。很多人不知道这个功能,知道的人又很少真正用过。为什么?因为限制太多,生产环境有更好的替代方案。今天把这个问题彻底讲清楚。

使用前提

要使用Hive ACID,必须同时满足:

① 文件格式必须是ORC(不能是Parquet)

② 表必须分桶(Hive 3.0)或开启非分桶事务(Hive 3.1+)

③ 表属性必须设置 transactional=true

-- 建表示例
CREATE TABLE user_profile (
  user_id STRING,
  name    STRING,
  email   STRING,
  country STRING
)
CLUSTERED BY (user_id) INTO 16 BUCKETS
STORED AS ORC
TBLPROPERTIES ('transactional'='true');
 
-- 现在可以做更新和删除
UPDATE user_profile SET email = 'new@mail.com'
WHERE user_id = 'u001';
 
DELETE FROM user_profile WHERE country = 'test';
 
-- 还能做MERGE INTO
MERGE INTO user_profile t
USING user_update s ON t.user_id = s.user_id
WHEN MATCHED THEN UPDATE SET email = s.email
WHEN NOT MATCHED THEN INSERT VALUES (s.user_id, s.name, s.email, s.country);

生产环境为什么很少用?

我在四家公司都没有在生产环境用过Hive ACID,原因有三个:

① 性能差

ACID表的读写性能比普通表低很多。每次读取时要合并base文件和delta文件,开销大。随着delta文件累积,性能会越来越差,需要定期做compaction。

② 只支持ORC格式

现在大多数公司用Spark引擎 + Parquet格式,为了用ACID强制换成ORC不值得。

③ Delta Lake / Iceberg提供了更好的替代

Delta Lake和Iceberg都基于Parquet,原生支持ACID + MERGE INTO + 时间旅行,性能更好,生态更开放。我在出海硬件公司用Delta Lake的MERGE INTO替代了之前复杂的“全量Join + 重写”逻辑,代码量减少70%。

那什么场景会用Hive ACID?

主要是一些老旧的纯Hive环境,没有引入Delta/Iceberg,但又需要做简单的更新删除(比如GDPR合规删除用户数据)。这种场景下Hive ACID勉强能用。

总结

方案优点缺点推荐度
Hive ACID原生支持,无需额外组件只支持ORC、性能差⭐
Delta Lake基于Parquet、性能好、生态丰富和Databricks绑定较深⭐⭐⭐⭐⭐
Apache Iceberg引擎无关、生态开放学习曲线稍高⭐⭐⭐⭐⭐

Hive ACID知道就行,生产环境优先用Delta Lake或Iceberg。面试时能说清楚限制和替代方案,说明你对整个数据湖生态有认知。

下一篇聊窗口函数在业务场景里的真实运用——不只是ROW_NUMBER,LAG/LEAD/SUM OVER/FIRST_VALUE各有妙用。

你们生产环境用过Hive ACID吗?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器