一句话定义:数据湖表格式(Table Format)是铺在 Parquet、ORC 这类文件之上的一层元数据账本,让对象存储里散落的一堆文件,表现得像一张支持事务的数据库表。最常被提到的两个实现是 Apache Iceberg 和 Delta Lake。
为什么需要它。早期数据湖的用法很朴素:在对象存储上建个目录,往里丢文件,目录名就是表名。问题随之而来——想改一行,得重写整个文件;两个人同时写,后写完的覆盖先写完的;任务写到一半挂了,留下半截脏数据;想看看上周三这份数据长什么样,只能靠之前手动复制的目录备份。
它怎么解决。核心思路是数据文件永不修改(immutable):每次写入都生成全新的数据文件,然后用一次原子操作替换一份清单文件(manifest 或 transaction log),声明这一版快照(snapshot)由哪些文件组成。
打个比方:图书馆更新藏书,不是把书全部重印一遍,而是换掉目录卡片。换卡片是瞬间完成的动作,所以读者翻目录时,要么看到旧版,要么看到新版,绝不会看到换了一半的卡片。
这份"卡片"带来三件事:
- 事务(ACID):一批写入要么全部生效,要么全部不生效,不留半成品。
- 快照与时间旅行(time travel):每个快照都有编号和时间,可以按快照号或时间点查询历史版本。
- 模式演进(schema evolution):加列、改列名、调类型通常不必重写历史数据。
和相邻概念的区别
| 概念 | 管什么 | 有没有快照和事务 |
|---|---|---|
| Parquet / ORC | 单个文件内部怎么编码压缩 | 没有 |
| 目录约定 + Hive Metastore | 这张表在哪个路径 | 基本没有 |
| Iceberg / Delta Lake | 哪些文件属于这一版表 | 有 |
一句话:文件格式管"一本书怎么排版",表格式管"书架上现在有哪些书、上一版又有哪些书"。
对从业者的意义。AI 训练数据是持续长出来的:新爬一批、新标一批、清洗规则又迭代一版。没有表格式时,"这个模型到底用哪版数据训的"只能靠人肉记笔记;有了快照,训练任务可以锁死一个 snapshot ID 去读,实验可复现,指标对不上时能顺着快照往回查。清洗脚本写错了,可以回滚到出问题之前的那一刻,而不是连夜重跑全量。
对普通职场人,最直观的好处是报表也能"回看上周三的数据长什么样",不必再因为上游覆盖而无法对账。
各家实现的功能边界和用法差异不小,具体以官方文档为准。
