四种开放表格式是什么
Iceberg、Hudi、Paimon、Delta 都属于开放表格式:在 Parquet/ORC 文件之上加一层事务日志与元数据,让对象存储上的数据具备 ACID 提交、快照回看、模式演进和小文件合并能力。四者的差异在于侧重:Iceberg 强调引擎中立与表结构演进,Hudi 强调按主键 upsert 与时间线增量读,Paimon 面向流式湖仓并支持主键表与变更日志,Delta 与 Spark 生态结合最紧密。选型的现实依据是现有引擎栈和写入形态,而不是纸面功能多少。
基本信息
| 适用平台 | 对象存储或 HDFS 之上,由 Spark、Flink、Trino 等引擎读写 |
|---|---|
| Iceberg 侧重 | 多引擎共享、隐藏分区、模式与分区演进、快照隔离 |
| Hudi 侧重 | 按主键 upsert、时间线增量读、COW 与 MOR 两种表 |
| Paimon 侧重 | 流式湖仓、LSM 主键表、可产生 changelog 供下游消费 |
| Delta 侧重 | 事务日志 _delta_log、与 Spark 生态深度集成 |
| 共性能力 | ACID 提交、时间旅行、模式演进、小文件合并 |
| 目录服务 | Hive Metastore、REST Catalog 或文件系统清单,跨引擎访问依赖它 |
| 选择依据 | 现有引擎栈、写入是流式还是批量、是否多引擎共享 |
典型使用场景
- 多引擎读同一份数据(Spark 加工、Trino 即席、Flink 实时)时优先 Iceberg,避免为每个引擎复制一份
- CDC 数据按主键 upsert 落地并支持下游按提交时刻增量拉取,选 Hudi 或 Paimon
- 以 Flink 流式链路为主、需要主键表与变更日志下游消费,选 Paimon
- 链路本来就以 Spark 批处理为核心,选 Delta 上手成本最低
- 要求数据可迁移、不愿被单一引擎绑定,用 Iceberg 这类元数据自描述的格式
存储布局差异
存储布局差异
# 同一张订单表在不同格式下的目录与元数据位置
iceberg: s3://lake/db.db/trade_order/data/dt=2026-10-12/x.parquet # 数据与元数据分离,metadata 下存快照
hudi: s3://lake/trade_order/dt=2026-10-12/part-*.parquet # 表根目录的 .hoodie 存时间线
paimon: s3://lake/warehouse/db.db/trade_order/dt=2026-10-12/bucket-0/ # LSM 结构,含变更日志
delta: s3://lake/trade_order/_delta_log/00000000000000000010.json # 每次提交一个日志文件
# 读取方式举例:同一份数据用不同引擎
SELECT count(*) FROM demo.db.trade_order WHERE dt = DATE '2026-10-12'; # Iceberg / Delta 通用写法
四种格式逐项对照
| 格式 | 侧重 | 适配引擎 |
|---|---|---|
| Iceberg | 多引擎共享、结构与分区演进 | Spark/Flink/Trino |
| Hudi | 按主键 upsert、时间线增量 | Spark/Flink |
| Paimon | 流式湖仓、主键表与变更日志 | Flink/Spark |
| Delta | 事务日志、Spark 生态一体 | 以 Spark 为主 |
格式切换意味着重写数据与作业,尽量在项目早期定下来,并把目录约定、表命名、元数据服务地址沉淀成团队规范,避免每个项目各自选型。
不要在同一批数据上混用多种格式。治理规则、权限模型与统计口径都无法统一,排障时也很难判断当前生效的是哪一套元数据。