数仓建模与 Lakehouse:从分层架构到表格式
0. 元信息
- 主题路径:
docs/topics/data-engineering-basics/subtopics/warehouse-modeling-and-lakehouse/README.md - 父主题:
data-engineering-basics - 适合对象:会写 SQL、用过 PostgreSQL/BigQuery、希望从”几张宽表”过渡到”分层数仓 + Lakehouse”的工程师
- 建议周期:2~2.5 周,每周 10~14 小时
- 前置知识:SQL、Python、Docker;建议先完成父主题第 2 阶段
- 最终目标:能设计 ODS/DWD/DWS/ADS 四层数仓 schema,用维度建模写事实表与维度表,在 Iceberg/Delta/Hudi 中至少精通一种表格式并解释 ACID、Time Travel、Hidden Partitioning
1. 学习路线
数仓分层架构 → 维度建模(星型 / SCD)→ 表格式概念 → Iceberg / Delta / Hudi 对比 → Time Travel → Lakehouse 落地
2. 阶段周数分配
| 阶段 | 2 周方案 | 2.5 周方案 | 备注 |
|---|---|---|---|
| 1. 分层架构 | 1.5 天 | 2 天 | ODS / DWD / DWS / ADS / DIM |
| 2. 维度建模 | 2 天 | 2.5 天 | 事实表 + 维度表 + SCD Type 2 |
| 3. 表格式概念 | 1.5 天 | 2 天 | Parquet + Iceberg manifest |
| 4. Iceberg / Delta / Hudi 对比 | 1.5 天 | 2 天 | 三表格式写入基准 |
| 5. Time Travel | 1 天 | 1.5 天 | 写错 → 回滚 → 验证 |
| 6. Lakehouse 落地 | 1.5 天 | 2 天 | Iceberg on MinIO + Spark + Trino |
每天 1.5~2 小时。2 周方案聚焦前 5 阶段;2.5 周方案多 2 天做 Lakehouse 端到端落地。
3. 核心知识 / 产出 / 标准表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 分层架构 | ODS / DWD / DWS / ADS / DIM、命名规范、分区策略 | 一份分层规范文档 + 完整 schema | 能讲清每层责任与命名边界 |
| 2. 维度建模 | 事实表、维度表、星型 vs 雪花、SCD Type 1/2/3/4/6 | 一份订单事实表 + 用户/商品/日期维度表 | 能区分事实与维度并选 SCD 类型 |
| 3. 表格式概念 | Parquet / Avro / ORC、ACID、Snapshot、Time Travel、Schema Evolution | 一份 Iceberg 表的 schema 与 manifest 解读 | 能讲清表格式与裸 Parquet 差异 |
| 4. Iceberg / Delta / Hudi 对比 | Spark 集成、Hive 集成、CDC、并发控制、性能 | 一份对比表 + 3 个表的写入/读取基准 | 能为不同场景选对表格式 |
| 5. Time Travel 与回滚 | Snapshot ID、Tag、Branch、回滚操作 | 一份 Iceberg Time Travel 演练(写错 → 回滚 → 验证) | 能用 SQL 回到任意快照 |
| 6. Lakehouse 落地 | Catalog(Hive/Glue/Polaris)、SQL 引擎(Trino/Spark/Flink) | 一份 Docker Compose 起 Iceberg on MinIO + Spark + Trino | 能用 SQL 查询 Iceberg 表 |
4. 第一周(每天 1.5~2 小时)
Day 1 约定:本计划使用 Docker Compose 起 Iceberg on MinIO + Spark 3.5 + Trino。SQL 客户端用
spark-sql与trino。Iceberg 元数据用SELECT * FROM table.files/table.snapshots/table.manifests查。所有表必须可重跑:清空数据 + 重跑 DDL 产出相同 schema。
| 日 | 任务 | 当天交付 | 自检 |
|---|---|---|---|
| Day 1 | 装 Docker Compose + MinIO + Spark(iceberg-spark image)+ Trino;用 docker compose up -d 起服务;用 spark-sql 连 Iceberg catalog | docker-compose.yml + Iceberg catalog 配置 | spark-sql> CREATE DATABASE dw; 成功;SHOW DATABASES 含 dw;SELECT 1 跑通 |
| Day 2 | 建分层 ODS / DWD / DWS / ADS:写 CREATE TABLE DDL(4 张表),用命名规范 ods_ / dwd_ / dws_ / ads_ + 分区策略(PARTITIONED BY (days(order_date))) | 4 张 Iceberg 表 DDL + 命名规范文档 | SHOW TABLES IN dw 列出 4 张表;DESCRIBE TABLE dw.ods_orders 显示分区字段;EXPLAIN 看是否走 partition pruning |
| Day 3 | 维度建模:写 dwd_orders 事实表(订单 + 金额 + 时间)+ dim_user / dim_product 维度表;SCD Type 2 字段(effective_date / end_date / is_current) | 3 张表 DDL + SCD Type 2 写入脚本 | INSERT INTO dim_user 含有效日期;UPDATE 旧版本时 end_date 被设;SELECT * FROM dim_user WHERE is_current=TRUE 只返回当前版 |
| Day 4 | Iceberg Time Travel:写一个脚本故意 UPDATE 改错数据;用 SELECT * FROM dw.orders FOR SYSTEM_TIME AS OF '2026-01-15' 回看历史;用 CALL dw.system.rollback_to_snapshot('orders', snapshot_id) 回滚 | 写错 + 回滚 + 验证脚本 | 改错后 SELECT * FROM dw.orders 是错的;回滚后与改错前一致;SELECT snapshot_id, committed_at FROM dw.orders.snapshots 显示快照链 |
| Day 5 | Iceberg / Delta / Hudi 对比:写 1 万行同一份数据到三种表格式;用 EXPLAIN ANALYZE 测写入耗时;用 SELECT count(*) FROM table.files 测小文件数 | 三表格式对比表(写入耗时 / 小文件数 / 查询 P95) | 三种表都成功写入 1 万行;Iceberg 默认小文件最少;Hudi MOR 模式查询慢于 COW;Delta OPTIMIZE 后小文件合并 |
| Day 6 | Catalog + 联邦查询:把 Iceberg 表挂到 Trino catalog;用 trino-cli 跑 SELECT * FROM iceberg.dw.dwd_orders;对比 Spark SQL 与 Trino 的查询计划 | Trino catalog 配置 + 查询计划对比 | Trino 查 Iceberg 跑通;EXPLAIN (FORMAT JSON) 看出 Trino 用 Iceberg 的 snapshot pruning;查询 P95 < 2s |
| Day 7 | 步骤 A:跑通订单数仓最小链路(CSV → Iceberg ODS → dbt DWD/DWS/ADS);步骤 B:补齐 4 类边界(源文件缺失、分区冲突、Time Travel 失败、SCD Type 2 end_date 漏写) | 完整链路 + 故障演练报告 | pytest -k test_warehouse_idempotent 4 个用例全过;每类故障复现 + 防护措施写到 notes/week1-day7.md |
Day 7 执行次序
步骤 A —— 最小可用数仓(60~90 分钟)
- 用 Spark 读 CSV → 写 Iceberg
ods_orders; - dbt 写
dwd_orders(清洗 + SCD Type 2 关联维表); - dbt 写
dws_orders_daily(按日汇总); - dbt 写
ads_top_products(Top 10 商品); - 4 层全部
dbt build通过。
步骤 B —— 4 类边界用例(30~45 分钟)
| # | 用例 | 期望行为 | 验证命令 |
|---|---|---|---|
| B1 | CSV 文件缺失 | DAG 失败 + 告警 | pytest -k test_missing_csv |
| B2 | 同一天重复写入 | 行数不变(幂等) | pytest -k test_idempotent |
| B3 | Time Travel 快照不存在 | 报错并提示 | pytest -k test_bad_snapshot |
| B4 | SCD Type 2 漏 end_date | 测试失败 + 阻塞 | pytest -k test_scd_enddate |
Day 7 当天必完成步骤 A;步骤 B 至少完成 B1、B2。
5. 阶段通用验收
- 不看答案独立重写一套 4 层 Iceberg 数仓 + Time Travel 演练;
- 用自己的话解释”为什么分层""为什么 SCD Type 2 常用""为什么 Iceberg 优于裸 Parquet""为什么 Hidden Partitioning 是关键”;
- 画一张图:分层架构图 + 维度模型星型图 + Iceberg manifest 关系图(三件套之一);
- 测试源缺失、分区冲突、Time Travel 失败、Schema 演进、小文件膨胀 5 类边界;
- 准备至少 3 组自定义数据集(电商 / IoT / 日志)并贴出实际 schema 与查询耗时;
- 记录 4 层每层行数、Iceberg 快照数、查询 P50 / P99、写入吞吐 4 个核心指标;
- 能修改已有 schema(加列 / 改类型 / 换分区策略)并用 Time Travel 验证历史可读。
交付存放:第 3 项的图、第 5 项的输出、第 6 项的指标,统一存到
week1/notes/或week1/<table>/README.md。
6. 最终验收
-
独立设计并交付一套分层数仓(ODS / DWD / DWS / ADS),至少 1 张事实表 + 3 张维度表 + Iceberg 表格式 + Time Travel 演练;
-
至少完成 18 个实战项(分布建议):
子阶段 题目数量 难度 平台建议 分层架构与命名 3 Easy / Medium Kimball Group 案例 维度建模与 SCD 4 Medium Kimball《Toolkit》Ch.2~4 Iceberg / Delta / Hudi 对比 4 Medium / Hard Apache 官方 Examples Time Travel 与回滚 3 Medium Iceberg Spec + Examples Lakehouse 端到端 4 Hard Iceberg on MinIO + Spark + Trino 约束:至少 9 项达到 Medium,至少 3 项达到 Hard;每项必须留可运行 SQL + EXPLAIN ANALYZE 输出。
-
完成 1 个综合项目:mini Lakehouse(CSV → Iceberg ODS → dbt DWD/DWS/ADS → Trino 看板);
-
能用 15 分钟讲清 4 层责任、维度建模取舍、Iceberg 快照机制、Time Travel 用法、表格式选型。
7. 综合项目
首选:mini Lakehouse(必做:分层数仓 + Iceberg + Time Travel + Trino 看板)。
备选:电商订单分析 Lakehouse(含 SCD Type 2 维表 + 维度建模 + Iceberg on MinIO)。
备选:IoT 时序 Lakehouse(含时序分区 + 流式写入 Iceberg + Grafana 看板)。
mini Lakehouse 必做要求:
- 输入:订单 CSV(至少 3 份不同 schema 的文件,按天分区);
- 输出:必输出(1)4 层 schema:ODS(原始 Iceberg)→ DWD(清洗 + SCD Type 2)→ DWS(每日汇总)→ ADS(Top 商品 / 用户 ARPU);(2)Time Travel 演练:写错 → 回滚 → 验证;(3)Trino 看板:日订单量 / GMV / Top 10 商品 / 漏斗转化;(4)Schema 演进演练:加列 / 改类型 / 改分区策略;(5)Iceberg 快照与 manifest 解读报告;
- 算法 / 工程:用
PARTITIONED BY (days(order_date));用TBLPROPERTIES ('format-version'='2');Trino catalog 用 Iceberg REST; - 进阶可选:用 Hudi 做对比基准;接 OpenLineage 输出血缘事件;用 StarRocks / ClickHouse 替代 Trino 做 OLAP。
任何综合项目都必须包含:
- 需求说明与数据契约(源 schema、目标 schema、SLA、分区策略);
- 分层架构图与命名规范文档;
- 核心代码(Spark SQL DDL + dbt models + Trino 看板配置);
- 边界测试(源缺失、分区冲突、Time Travel 失败、Schema 演进、小文件膨胀);
- 可观测(Iceberg snapshot 元数据 + Trino metrics);
- README(设计取舍、表格式选型理由、下一步);
- 复盘记录(模拟 1 次回滚 + 1 次 Schema 演进失败,写
retrospective.md); - notes/ 规范:
| 文件 | 内容 |
|---|---|
notes/design.md | 分层架构图、维度模型星型图、命名规范 |
notes/test.md | 每组测试的输入 / 期望 / 实际 / 通过情况 |
notes/retrospective.md | 用时、难点、收获、改进点 |
notes/runbook.md | 常见失败 + 处置 SOP(回滚失败 / Schema 演进 / 小文件爆炸) |
notes/iceberg-snapshots/ | Iceberg 快照与 manifest 截图(snapshots / manifests / files 视图) |
notes/explain-output/ | 关键 SQL 的 EXPLAIN ANALYZE 输出 |
notes/contract-yaml/ | 数据契约(源 schema + 目标 schema + SLA + owner) |
notes/sample-data/ | 至少 3 组测试数据集(电商 / IoT / 日志) + schema 与耗时表 |
本主题贡献
数仓建模的核心矛盾是”分析查询要快 vs 业务需求会变”。本子主题专门讲清 star schema + Iceberg partition evolution 如何把这条矛盾变成可演进架构——以 Kimball star schema 为建模事实标准,dbt 为转换与测试引擎,Iceberg hidden partitioning + partition evolution 为存储演进基础,把 Time Travel 当作错误回滚与历史追溯的事实机制;不重复父主题的 Airflow 编排与通用 SQL 调优。
3 职责
- 用 star schema 把业务拆成”1 张事实表 + N 张维度表”,维度表配 SCD Type 2(
effective_date/end_date/is_current)做历史追溯;事实表配 dbt 5 类测试(unique / not_null / relationships / freshness / accepted_values)做质量门禁。 - 用 Iceberg partition evolution(
partition_spec可演进,不重写历史数据)应对数据量变化——从按天分区演进到按月分区、按小时分区,下游查询自动走 partition pruning。 - 用 Iceberg Time Travel(
SELECT * FROM tbl FOR SYSTEM_TIME AS OF 'snapshot-id'+CALL system.rollback_to_snapshot('tbl', snapshot_id))做错误回滚与历史审计;用snapshots/manifests/files元数据视图解读小文件与写入模式。
4 交付物
- 一份 4 层 Iceberg schema(ODS / DWD / DWS / ADS),事实表
fct_orders+ 维度表dim_user/dim_product/dim_date(SCD Type 2),命名规范ods_ / dwd_ / dws_ / ads_ / dim_。 - 一份 dbt 项目(staging / intermediate / marts 三层),5 条 dbt test,配
dbt source freshness+dbt build质量门禁;Iceberg 表PARTITIONED BY (days(order_date))+TBLPROPERTIES ('format-version'='2')。 - 一份 partition evolution 演练脚本(按天 → 按月 → 按小时三次演进),配
EXPLAIN看 partition pruning 命中,每次演进后 Time Travel 读历史数据 OK。 - 一份 Iceberg 元数据解读报告(
SELECT * FROM table.snapshots/manifests/files),含 Time Travel 回滚演练(写错 →rollback_to_snapshot→ 验证一致)+ 三表格式对比基准(Iceberg / Delta / Hudi 写入耗时与小文件数)。
3 指标
- dbt build 5 类测试通过率 100%(
dbt test输出 5 passed,dbt buildexit code 0)。 - Iceberg partition pruning 命中率 ≥ 90%(查询走分区裁剪,扫描文件数 / 总文件数 < 10%)。
- Time Travel 回滚恢复时长 < 1 min(
rollback_to_snapshot执行到下游查询一致)。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 全部 | 主线书 | Ralph Kimball《The Data Warehouse Toolkit》 | https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/ | 维度建模必读 1~5 章 |
| 全部 | 对照书 | Bill Inmon《Building the Data Warehouse》 | https://www.wiley.com/en-us/Building+the+Data+Warehouse-p9780764599446 | CIF 建模对照读 |
| 1~2 | 数仓 | Kimball Group Design Tips | https://www.kimballgroup.com/category/design-tips/ | 实战设计建议 |
| 3~4 | Lakehouse | Apache Iceberg 官方文档 | https://iceberg.apache.org/docs/latest/ | 表格式规范与 API |
| 3~4 | Lakehouse | Delta Lake 官方文档 | https://docs.delta.io/ | 与 Spark 深度集成 |
| 3~4 | Lakehouse | Apache Hudi 官方文档 | https://hudi.apache.org/ | 记录级索引与 CDC |
| 5 | Time Travel | Iceberg Spec v2 | https://iceberg.apache.org/spec/ | 快照与 manifest 规范 |
| 6 | 联邦查询 | Trino 官方文档 | https://trino.io/docs/current/ | Iceberg connector |
| 6 | 存储 | MinIO 官方文档 | https://min.io/docs/minio/linux/index.html | S3 兼容对象存储 |
| 6 | 引擎 | Spark SQL 官方文档 | https://spark.apache.org/docs/latest/sql-programming-guide.html | Spark 集成 Iceberg |
| 全部 | 哲学 | Kleppmann《DDIA》Ch.3 / 5 | https://dataintensive.net/ | 存储与编码基础 |
| 全部 | 生态对比 | Iceberg / Delta / Hudi 基准 | https://lakefs.io/blog/ | 三种表格式性能对比博客 |
许可证提示:Iceberg / Delta / Hudi / Spark / Trino / MinIO 都是 Apache-2.0;Delta Lake 由 Linux Foundation 托管,商用无需特殊授权。复制 Apache 项目示例前请保留 LICENSE 与 NOTICE。默认做法是读规范后自己写 DDL,而不是复制官方 Example。
默认使用顺序:先读 Kimball《Toolkit》第 1~3 章建立维度建模心智 → 装 Iceberg on MinIO + Spark + Trino → 写 4 层 DDL → 用 SCD Type 2 写 dim_user → 跑 Time Travel 演练 → 对比 Iceberg / Delta / Hudi 写入基准 → 配 Trino catalog 做联邦查询 → 读 Iceberg Spec v2 看 manifest 规范 → 写复盘到 notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。规范会演进,记录时务必写明版本与日期。
9.1 背景与动机
传统数仓(Teradata、Greenplum、Snowflake)解决”结构化分析查询”问题,但成本高、扩展难。数据湖(HDFS + Parquet)解决”低成本存储任意数据”问题,但缺 ACID 与 schema。2017 年 Delta Lake、2018 年 Iceberg、2019 年 Hudi 先后开源,让 Lakehouse 把两者合一——同一份存储既支持低成本 schema-on-write 又支持 SQL 分析查询。Kimball 的维度建模理论从 1996 年至今仍是数仓建模的事实标准,星型 schema 与 SCD 仍是设计落点。
9.2 概念地图
flowchart LR
Source[源系统] --> ODS[ODS 原始层]
ODS --> DWD[DWD 明细层]
DIM[维度表] --> DWD
DWD --> DWS[DWS 汇总层]
DWD --> DIM
DWS --> ADS[ADS 应用层]
Lake[Lakehouse Iceberg/Delta/Hudi] --> ODS
Lake --> DWD
Lake --> DWS
Catalog[Hive/Glue/Polaris] --> Lake
Engine[Spark/Trino/Flink] --> Lake
9.3 基础知识讲解
9.3.1 经典论文
| 资料 | 贡献 | 读法 |
|---|---|---|
| Ralph Kimball, The Data Warehouse Toolkit(1996 初版) | 维度建模 | 必读第 1~5 章 |
| Bill Inmon, Building the Data Warehouse(1990) | 第三范式建模(CIF) | 与 Kimball 对照读 |
| Armbrust et al., Delta Lake(VLDB 2020) | Lakehouse 起点 | 看 ACID 与 Time Travel |
| Schmidt et al., Apache Iceberg(2020) | 表格式规范 | 看 manifest list |
| Kiran et al., Hudi(2021) | 记录级索引 | 看 MOR vs COW |
9.3.2 经典书籍
| 书 | 侧重 | 用法 |
|---|---|---|
| Ralph Kimball & Margy Ross, The Data Warehouse Toolkit(3rd ed., Wiley 2013) | 维度建模 | 必读 1~5 章 |
| Bill Inmon, Building the Data Warehouse(4th ed., Wiley 2005) | CIF 建模 | 选读 1~3 章 |
| Holden Karau et al., Spark: The Definitive Guide(O’Reilly 2018) | Spark 全景 | 选读第 5 章(Spark SQL) |
9.3.3 优秀博客与文档
| 资料 | 特点 | 用法 |
|---|---|---|
| Apache Iceberg 官方文档 | 表格式规范 | 必读 spec + Spark 集成 |
| Delta Lake 官方文档 | Delta 表 API | 看 Quickstart + Time Travel |
| Apache Hudi 官方文档 | Hudi 索引与 CDC | 看 COW vs MOR |
| Kimball Group | 维度建模方法 | 看 Design Tips |
| Trino 官方文档 | 联邦查询 | 看 Iceberg connector |
9.3.4 核心人物
| 人物 | 影响 | 材料 |
|---|---|---|
| Ralph Kimball | 维度建模 | Kimball Group |
| Bill Inmon | CIF 建模 | DW 经典书 |
| Michael Armbrust | Delta Lake | Spark/Delta 公开演讲 |
| Ryan Blue | Iceberg 起源 | Netflix 公开演讲 |
| Vinoth Chandar | Hudi 起源 | Uber 公开演讲 |
9.3.5 开发方法
| 方法 | 动作 | 何时用 |
|---|---|---|
| Layer-first | 先定分层规范,再写 schema | 任何数仓 |
| Star-schema default | 星型优先,雪花慎用 | 维度建模 |
| SCD Type 2 for history | 历史追溯用 Type 2 | 维度表 |
| Hidden partitioning | 用 Iceberg/Hudi 自动分区 | 写多读多 |
| Partition evolution | 分区策略可演进 | 数据量变化大 |
9.4 经典问题与经典案例(≥5 道)
| # | 问题 | 重要性 | 最简答案 |
|---|---|---|---|
| 1 | ODS/DWD/DWS/ADS 四层怎么划 | 分层基本 | 原始 → 明细 → 汇总 → 应用 |
| 2 | 星型 vs 雪花怎么选 | 性能与可维护 | 星型优先;维度过宽才雪花 |
| 3 | SCD Type 1/2/3 怎么选 | 历史追溯 | 大部分 Type 2 |
| 4 | Iceberg vs Delta vs Hudi | 表格式选型 | Spark 选 Delta,Hive 选 Iceberg,CDC 强选 Hudi |
| 5 | Time Travel 怎么用 | 错误回滚 | Iceberg 用 AS OF 子句 |
| 6 | Hidden Partitioning 怎么配 | 性能 | 用 partition_transform |
| 7 | Schema 演进怎么兼容 | 加列删列 | 用表格式的 schema evolution |
| 8 | Catalog 怎么选 | 元数据管理 | Hive Metastore / AWS Glue / Polaris |
9.5 学习难点
概念难点
| 难点 | 突破路径 |
|---|---|
| ODS 与 DWD 边界 | 画一条订单从源到 ADS 的路径 |
| SCD Type 2 实现 | 写 effective_date / end_date |
| 表格式 ACID 机制 | 读 Iceberg manifest list |
思维难点
| 难点 | 突破路径 |
|---|---|
| 维度与事实区分 | 用”可度量 vs 描述性”分类 |
| 表格式选型 | 用三场景对比:批、CDC、读优化 |
工程难点
| 难点 | 突破路径 |
|---|---|
| Iceberg 并发写入冲突 | 配 commit.retry.num-retries |
| Delta 小文件问题 | 用 OPTIMIZE 合并 |
| Hudi MOR 查询性能 | 配 compaction 策略 |
9.6 技术标准与接口
Entity
| 名称 | 版本 | 组织 | 状态 | 许可证 |
|---|---|---|---|---|
| Apache Iceberg | 1.x | Apache | GA | Apache-2.0 |
| Delta Lake | 2.x / 3.x | Linux Foundation | GA | Apache-2.0 |
| Apache Hudi | 0.14+ | Apache | GA | Apache-2.0 |
| Apache Parquet | 2.x | Apache | 成熟 | Apache-2.0 |
| Apache Avro | 1.11+ | Apache | 成熟 | Apache-2.0 |
| Hive Metastore | 3.x | Apache | GA | Apache-2.0 |
| AWS Glue Catalog | — | AWS | 商业 | 商业 |
| Polaris Catalog | 0.x | Apache | 活跃 | Apache-2.0 |
Scope
Iceberg/Delta/Hudi 是表格式,不替代文件存储与计算引擎;Hive Metastore/Glue 是目录服务,不替代查询引擎。
Structure
- Iceberg:
metadata.json + manifest list + manifest file + Parquet data file,Snapshot 是不可变视图。 - Delta Lake:
_delta_log/JSON + Parquet,用 OPTIMIZE 合并小文件。 - Hudi:Base file + Log file,COW 写时合并、MOR 读时合并。
Ecosystem
- Catalog:Hive Metastore、AWS Glue、Polaris、Unity Catalog。
- 引擎:Spark、Trino、Flink、Presto、Hive。
- 文件格式:Parquet、Avro、ORC。
- 元数据:Apache Atlas、DataHub、Unity Catalog。
Depth Tiers
| 层级 | 能力 | 标准 |
|---|---|---|
| L0 | 知道存在 | 知道数仓分层与 Lakehouse 概念 |
| L1 | 看得懂示例 | 能读懂 Iceberg/Delta 表 schema |
| L2 | 能正确调用 | 能用 SQL/Spark 写入查询表格式 |
| L3 | 能解释与排错 | 能定位并发冲突、Time Travel、Schema 演进问题 |
| L4 | 能设计与扩展 | 能为新业务设计分层 schema + 表格式选型 |
本子主题目标:L3。
Source
- Apache Iceberg 官方文档:引用快照 2026-07-30。
- Delta Lake 官方文档:引用快照 2026-07-30。
- Apache Hudi 官方文档:引用快照 2026-07-30。
9.7 关键代码
9.7.1 Iceberg 表 + Time Travel
-- 9.7.1 Iceberg 表创建、写入、Time Travel
-- Spark SQL
CREATE TABLE dw.orders (
order_id BIGINT,
user_id BIGINT,
amount DECIMAL(10, 2),
order_date DATE
) USING iceberg
PARTITIONED BY (days(order_date))
TBLPROPERTIES ('format-version' = '2');
INSERT INTO dw.orders VALUES (1, 100, 99.50, DATE '2026-01-15');
-- Time Travel:回滚到上一个快照
CALL dw.system.rollback_to_snapshot('orders', <snapshot_id>);
-- 按快照时间查询
SELECT * FROM dw.orders FOR SYSTEM_TIME AS OF '2026-01-15 12:00:00';
9.7.2 SCD Type 2 维度表
-- 9.7.2 PostgreSQL 写 SCD Type 2 用户维度表
CREATE TABLE dim_user (
user_id BIGINT,
name TEXT,
email TEXT,
-- SCD Type 2 字段
effective_date DATE NOT NULL,
end_date DATE,
is_current BOOLEAN NOT NULL DEFAULT TRUE,
version INT NOT NULL DEFAULT 1
);
-- 一次性更新:触发新版本
UPDATE dim_user
SET end_date = CURRENT_DATE,
is_current = FALSE
WHERE user_id = 100 AND is_current = TRUE;
INSERT INTO dim_user
VALUES (100, 'New Name', 'new@example.com', CURRENT_DATE, NULL, TRUE, 2);
9.7.3 Docker Compose 起 Iceberg on MinIO
# 9.7.3 docker-compose.yml:Iceberg on MinIO + Spark
services:
minio:
image: minio/minio:latest
command: server /data --console-addess ":9001"
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123
ports: ["9000:9000", "9001:9001"]
spark-iceberg:
image: tabulario/iceberg-spark:3.5
depends_on: [minio]
environment:
- AWS_ACCESS_KEY_ID=minio
- AWS_SECRET_ACCESS_KEY=minio123
- AWS_REGION=us-east-1
- S3_ENDPOINT=http://minio:9000
volumes: ["./warehouse:/warehouse"]
10. 常见误区
- 分层不规范,ODS 直接写 ADS;
- 用雪花型,雪花型难维护;
- SCD Type 2 缺 end_date / is_current;
- Iceberg 当裸 Parquet 用,不配 schema evolution;
- Delta 不做 OPTIMIZE,小文件爆炸;
- Hudi 选错 MOR/COW 模式;
- Catalog 选 Hive 但跨云访问;
- Time Travel 配太短保留期(默认 5 天);
- 不做小文件合并,元数据膨胀;
- 维度表与事实表命名混用;
- 分区字段用业务时间戳,跨时区混乱;
- 表格式 schema evolution 跳过兼容性检查。
11. 所有知识点分类
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:数据与人工智能 主 + 工程技术 辅。