ARTICLE / 2 MIN READ

对象存储数据湖的文件格式与表格式选择

讲解 Parquet、ORC、Iceberg、Hudi 和 Delta 在压缩、Schema 演进与更新场景中的取舍。

对象存储便宜、耐久、扩展性好,但只把文件堆在目录里并不能形成可治理的数据湖。文件格式负责高效读取,表格式负责版本、事务和元数据。

为什么使用列式文件

Parquet 和 ORC 按列存储,分析查询只读取需要的列,并利用字典编码、Run-length 和压缩降低 IO。字段类型越准确,裁剪和压缩越有效。

日志原始 JSON 可以保留一份,但清洗后应转成列式明细,避免每次查询都重复解析文本。

分区与文件大小

目录分区通常使用日期、租户或业务域。分区过细会产生大量小文件,分区过粗又会增加扫描量。查询最常用的过滤字段应进入分区或文件内统计信息。

文件大小要与引擎并行度匹配,目标是减少小文件,同时让单文件读取不会成为长尾。流式落盘后需要定期 compaction。

表格式解决什么

Iceberg、Hudi 和 Delta 都提供快照、Schema 演进、并发写入和时间旅行能力,但更新模型、索引、生态和运维方式不同。

选型时重点看:

  • 是否需要 Upsert 和 CDC;
  • 是否需要按快照回读;
  • 使用哪些计算引擎;
  • 元数据规模和 compaction 能力;
  • 多租户权限和回滚方式。

Schema 演进

新增字段通常比改字段类型安全。字段删除、重命名和时区变更要通过版本化契约处理,不能直接覆盖旧数据解释方式。

数据湖的最小闭环

原始文件 -> 校验清单 -> 清洗表 -> 质量报告
     |                         |
     +-> 版本快照 <-------------+
                 -> 下游数仓/服务

每个批次记录文件列表、大小、校验和、Schema 版本、处理时间和质量结果。失败批次隔离,成功批次再更新表快照。

对象存储并不等于无限免费。读放大、请求次数、跨区域流量、元数据和 compaction 都会产生成本,需要结合生命周期和查询热度规划。

GITHUB DISCUSSION

评论与回复

评论保存在 GitHub Discussions,登录 GitHub 后即可参与,发布和回复都在本页完成。

评论区进入视口后自动加载。