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 后即可参与,发布和回复都在本页完成。
评论区进入视口后自动加载。