存储格式基础:Parquet 与 Delta Lake 的关系

聊成本管控,得先搞清楚数据是怎么存的。很多人一上来就调参数、配策略,结果发现效果不好——说白了,底层存储格式都没吃透。

我刚开始做数据架构那会儿,也踩过这个坑。当时团队用 JSON 存日志,每天几百 GB,跑个查询要等半小时。后来换成 Parquet,压缩比直接干到 1:5,查询时间降到几分钟。嗯,从那以后我就养成了一个习惯:先看存储格式,再谈优化。

Parquet:列式存储的压缩优势

Parquet 是啥?一种列式存储格式。跟行式存储(比如 CSV、JSON)完全两个路子。

你想想看,行式存储存一条记录,所有字段挨着写在一起。查某个字段时,得把整行数据都读出来。浪费 IO,也浪费内存。

列式存储呢?同一列的数据连续存放。查某个字段,只读那一列的数据块。IO 少了,压缩也更好——因为同一列的数据类型一致,值分布也相似。

核心结论:列式存储天然适合分析型负载。压缩率高、扫描快、IO 小。这三个特性,直接决定了你的存储成本和查询成本。

我举个例子。一个订单表有 50 个字段,但你每天只查 5 个。用 Parquet 存,只读那 5 列的数据。用行式存,50 列全读。差距有多大?你自己算算。

Parquet 的压缩机制

Parquet 支持多种压缩编码。我个人习惯用 Snappy,平衡压缩比和速度。但如果你对存储成本特别敏感,可以上 Zstd 或 Gzip。

压缩算法 压缩比 压缩速度 解压速度 适用场景
Snappy 中等(约 2:1) 极快 极快 实时查询、高频写入
Zstd 高(约 3:1 ~ 5:1) 较快 较快 冷数据、归档存储
Gzip 很高(约 4:1 ~ 6:1) 慢 慢 低频查询、长期归档
LZ4 较低(约 1.5:1) 极快 极快 高吞吐写入、日志流

我的建议:热数据用 Snappy,冷数据用 Zstd。别一股脑全用 Gzip,压缩慢、解压也慢,查询延迟受不了。

Delta Lake:在 Parquet 之上加了什么?

Delta Lake 不是替代 Parquet 的。它是在 Parquet 外面包了一层「事务层」。

你可以这么理解:Parquet 是砖头,Delta Lake 是水泥。砖头本身很好,但堆在一起容易倒。水泥把它们粘起来,还加了钢筋——事务日志、版本控制、Schema 强制、数据回滚。

Delta Lake 的核心组件就两个:

  • Parquet 数据文件:实际存储数据的文件,跟普通 Parquet 没区别
  • Delta 事务日志(_delta_log):记录每一次数据变更的 JSON 文件

每次写入、更新、删除,Delta Lake 都会在 _delta_log 目录下生成一个新的 JSON 文件。这个文件记录了这次操作改了哪些 Parquet 文件、新增了哪些、删除了哪些。

注意:事务日志会不断累积。时间长了,日志文件数量可能比数据文件还多。我见过一个项目,日志目录占了总存储的 30%。这就是成本黑洞。

数据文件的生命周期

理解文件生命周期,才能做好成本管控。Delta Lake 里的数据文件,大致经历这几个阶段:

  1. 写入阶段:新数据写入,生成新的 Parquet 文件
  2. 活跃阶段:文件被查询引擎频繁读取
  3. 合并阶段:小文件合并成大文件(OPTIMIZE 操作)
  4. 归档阶段:旧版本数据不再被查询,但保留用于时间旅行
  5. 清理阶段:VACUUM 操作删除过期文件

每个阶段都有成本优化的空间。比如写入阶段,文件大小控制不好,后面合并成本就高。归档阶段,保留版本太多,存储成本直线上升。

避坑指南:我曾经帮一个客户做成本审计,发现他们 Delta 表保留了 90 天的历史版本。实际上业务只需要 7 天。多出来的 83 天版本,每个月多花 2000 多美元的存储费。嗯,调完保留策略,成本直接砍半。

Parquet 与 Delta Lake 的对比

特性 Parquet Delta Lake
存储格式 列式存储 Parquet + 事务日志
事务支持 无 ACID 事务
版本控制 无 时间旅行(默认保留 30 天)
Schema 强制 无 Schema 校验 + 自动演进
小文件问题 存在 存在(需 OPTIMIZE 解决)
压缩效率 高 与 Parquet 一致
成本管控手段 有限(压缩 + 分区) 丰富(OPTIMIZE、VACUUM、ZORDER)

说白了,Parquet 给了你一个很好的基础,但 Delta Lake 给了你更多控制权。控制权越多,优化空间越大,但也越容易出错。

核心知识体系

下面这张图,把本章的核心逻辑串起来了。我建议你多看几遍,理解每个节点之间的关系。

Delta Lake 存储成本管控知识体系 存储格式基础 Parquet 列式存储 Delta Lake 事务层 列式压缩优势 事务日志 版本控制 Schema 强制 数据文件生命周期:写入 → 活跃 → 合并 → 归档 → 清理 OPTIMIZE 合并 VACUUM 清理 保留策略配置 核心逻辑:理解存储格式 → 掌握文件生命周期 → 针对性配置成本管控策略 每个环节都有优化空间,关键在于找到当前阶段的瓶颈

小结

这一章我们聊了三件事:

  • Parquet 列式存储:压缩好、扫描快,是成本优化的基础
  • Delta Lake 事务层:在 Parquet 上加了版本控制和事务能力,但也带来了额外的存储开销
  • 数据文件生命周期:从写入到清理,每个阶段都有成本优化的切入点

记住一句话:不懂存储格式,就别谈成本优化。后面几章我们会深入每个优化手段,但地基先得打牢。