数仓、数据湖与湖仓一体
数据仓库面向结构化数据,写入时校验 schema,治理强、口径稳定,适合支撑固定报表与指标体系;数据湖用对象存储承载结构化与非结构化原始数据,schema 后置(读取时解析),成本低但治理责任交给上层。湖仓一体在对象存储之上叠加 Iceberg、Hudi、Delta 这类表格式,为文件加上事务、快照与 schema 演进能力,再用 Spark、Trino、Flink 等引擎查询,兼顾低存储成本与数仓级可靠性。
基本信息
| 数仓 | 结构化为主,写入时校验 schema,MPP 或数仓引擎 |
|---|---|
| 数据湖 | 原始多形态数据,读取时解析,对象存储加计算引擎 |
| 湖仓一体 | 对象存储加表格式(Iceberg/Hudi/Delta),多引擎共享 |
| 表格式关键能力 | ACID 事务、时间旅行、schema 演进、分区裁剪 |
| 选型依据 | 数据形态、治理要求、并发查询类型与成本预算 |
典型使用场景
- 指标体系与固定报表:走数仓分层,保证口径统一与可追溯
- 埋点日志、IoT 原始数据归档与探索:先入湖,用后再加工建模
- 机器学习特征原始数据与训练样本,需要大范围扫描与格式自由
- 多引擎共享同一份数据:批、流、交互式分析同时读取同一张湖表
- 历史回溯:利用表格式的时间旅行读取某次写入前的数据快照
三者对比
| 维度 | 数据仓库 | 数据湖 | 湖仓一体 |
|---|---|---|---|
| 数据类型 | 结构化为主 | 结构化、半结构化、非结构化 | 结构化加开放格式文件 |
| schema | 写入时校验 | 读取时解析 | 表格式提供演进与校验 |
| 治理 | 强,口径统一 | 弱,依赖上层治理 | 元数据与权限统一管理 |
| 典型引擎 | MPP 与数仓引擎 | Spark 加对象存储 | Spark、Trino、Flink 加表格式 |
| 存储成本 | 相对较高 | 低 | 低 |
湖表定义与时间旅行
湖表定义与时间旅行
-- Spark SQL 建 Iceberg 表:分区与表属性一并声明
CREATE TABLE lake.orders (order_id BIGINT, amount DECIMAL(18,2), dt STRING)
USING iceberg
PARTITIONED BY (dt);
-- 时间旅行:读取某个快照或时间点之前的版本
SELECT * FROM lake.orders VERSION AS OF 20261011093000;
SELECT COUNT(1) FROM lake.orders TIMESTAMP AS OF '2026-10-11 09:30:00';选型看数据形态与治理要求:口径要求强一致的场景仍建议按数仓范式组织,湖负责承载原始数据与探索性分析,湖仓一体只是让两者共享同一份存储。
把数据湖当数仓用却缺少口径治理,报表数字就不可信;湖仓一体并没有自动带来治理能力,元数据、权限与质量规则仍需单独建设。
湖里保留海量原始数据必须有生命周期策略(冷热分层、压缩小文件、定期清理无引用快照),否则存储与元数据规模会持续膨胀,查询也会被小文件拖慢。