Delta Lake
问题
什么是 Delta Lake?它和 Iceberg 有什么区别?
答案
Delta Lake 核心特性
Delta Lake 是 Databricks 开源的数据湖表格式,基于 Parquet + JSON 事务日志实现 ACID。
| 特性 | 说明 |
|---|---|
| ACID 事务 | 事务日志保证原子性 |
| 时间旅行 | 查询/恢复历史版本 |
| Schema 演进 | 添加/合并 Schema |
| Upsert(MERGE) | 高效更新/删除 |
| Z-Ordering | 多维聚类优化查询 |
| Liquid Clustering | 自动优化数据布局 |
事务日志机制
事务日志原理
- 每次操作在
_delta_log/目录产生一个 JSON 文件 - JSON 记录添加/删除了哪些 Parquet 文件
- 每 10 次提交自动生成 Checkpoint(Parquet 格式)加速读取
- 通过日志重放确定当前表的文件集合
常用操作
-- Spark SQL 操作 Delta Lake
-- 创建 Delta 表
CREATE TABLE events (
event_id BIGINT,
user_id BIGINT,
event_name STRING,
event_time TIMESTAMP
) USING delta
PARTITIONED BY (date_trunc('day', event_time));
-- MERGE(Upsert):CDC 数据合并
MERGE INTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
-- 时间旅行
SELECT * FROM events VERSION AS OF 5;
SELECT * FROM events TIMESTAMP AS OF '2024-01-01';
-- 恢复到历史版本
RESTORE TABLE events TO VERSION AS OF 5;
-- Z-Ordering:优化多列查询
OPTIMIZE events ZORDER BY (user_id, event_name);
-- 清理历史版本
VACUUM events RETAIN 168 HOURS; -- 保留 7 天
Delta Lake vs Iceberg
| 维度 | Delta Lake | Iceberg |
|---|---|---|
| 开源方 | Databricks | Netflix → Apache |
| 元数据格式 | JSON 事务日志 | Manifest + Metadata |
| 分区演进 | ⚠️ 有限 | ✅ 强 |
| 隐藏分区 | ❌ | ✅ |
| 多引擎支持 | Spark 原生,其他通过 UniForm | 多引擎原生支持 |
| Databricks 集成 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 社区趋势 | 稳定 | 增长最快 |
| 数据布局优化 | Z-Order、Liquid Clustering | Sort Order |
Delta Lake 的局限
- 深度绑定 Spark/Databricks 生态
- 其他引擎(Trino、Flink)支持不如 Iceberg 完整
- 分区演进能力较弱
- UniForm:Delta 3.0 新特性,可同时兼容 Iceberg 和 Hudi 读取
常见面试问题
Q1: 什么是 Z-Ordering?
答案: Z-Ordering 是一种多维数据排列技术,将多列的值映射到一维空间,使得查询多列条件时能高效跳过不相关的数据文件。适合多列联合过滤的场景,但不适合高基数列。
Q2: VACUUM 操作的作用是什么?
答案:
- 清理不再被引用的历史 Parquet 文件
- 节省存储空间
- 默认保留 7 天(168 小时)
- 注意:VACUUM 后无法再时间旅行到被清理的版本
相关链接
- Apache Iceberg - 主流竞品对比
- Apache Hudi - 另一种表格式
- 湖仓一体 - 综合选型
- Spark - Delta Lake 的主要计算引擎