1. 数据湖仓概述:什么是数据湖仓、为什么需要Schema变更、数据湖仓与传统数据仓库的区别
1.1 从数据仓库到数据湖,再到数据湖仓
先聊聊我个人的经历。十年前我刚入行时,数据仓库还是的王者。那时候我们做ETL,建星型模型,写存储过程,一切井井有条。但有个问题一直让我头疼——非结构化数据怎么处理?日志文件、JSON、图片元数据,这些东西在传统数仓里根本塞不进去。
后来数据湖火了。Hadoop、Spark、S3,什么都能往里扔。嗯,确实能存了,但新的问题又来了——数据湖变成了数据沼泽。没有事务,没有一致性,写了一半的任务崩溃了,数据就烂在那里。我在项目里见过太多次这种场景,说白了就是「存得住,管不住」。
数据湖仓(Lakehouse)就是来解决这个矛盾的。它把数据湖的廉价存储和数据仓库的事务能力合在了一起。你想想看,既能存PB级的原始数据,又能保证ACID事务,这不就是我们一直想要的吗?
核心定义:数据湖仓是一种新型的数据管理架构,它在数据湖的低成本存储之上,实现了数据仓库的ACID事务、Schema强制、数据治理等能力。典型代表是Delta Lake、Apache Iceberg、Apache Hudi。
我个人习惯把数据湖仓理解为「给数据湖装上了数据库引擎」。底层还是对象存储或HDFS,但上层多了事务日志、元数据管理和Schema控制。这样你在读数据时,永远看到的是一个一致性的快照。
1.2 为什么需要Schema变更
好,现在问题来了——数据湖仓里存的数据,Schema是固定的吗?
不是。我在实际项目中遇到过太多次这样的场景:业务方说「这个字段我们加一下」,或者「那个字段类型不对,得改」。传统数仓里改个字段类型,你得先drop表再重建,下游报表全得跟着改。那叫一个痛苦。
数据湖仓的Schema变更,说白了就是让你能「在线」修改表结构,而不需要重写整个数据集。这背后依赖的是Schema演化(Schema Evolution)机制。
为什么会这样?因为数据湖仓的存储格式(Parquet、ORC)本身是自描述的,每个文件都带着自己的Schema。当你新增一个字段时,旧文件没有这个字段,但查询引擎读到旧文件时会自动补Null。这就是Schema演化的核心思想——向前兼容。
避坑指南:我曾经在一个生产环境里直接对Delta表执行了ALTER TABLE DROP COLUMN,结果下游的Spark Streaming作业全部报错。后来我学乖了——Schema变更一定要先评估下游依赖,尤其是流式作业。建议用ALTER TABLE ... SET TBLPROPERTIES先做灰度验证。
常见的Schema变更场景包括:
- 新增字段:业务扩展,比如用户表加个
phone_number - 删除字段:数据合规,比如不再存储身份证号
- 修改字段类型:精度调整,比如
INT改成BIGINT - 字段重命名:统一命名规范,比如
user_name改成username - 嵌套Schema变更:Struct或Array内部的字段调整
每种变更的风险等级不一样。我建议你记住一条原则:加字段基本安全,删字段和改类型要格外小心。
1.3 数据湖仓与传统数据仓库的区别
很多人问我:「有了数据湖仓,是不是数据仓库就该淘汰了?」
我的回答是:不是淘汰,是进化。数据湖仓不是要干掉数仓,而是把数仓的能力下沉到了数据湖这一层。下面这张表是我在项目里总结的对比,你可以看看:
| 对比维度 | 传统数据仓库 | 数据湖仓 |
|---|---|---|
| 存储成本 | 高(专用硬件、SAN存储) | 低(对象存储、HDFS) |
| 数据格式 | 行式存储(如Oracle、Teradata) | 列式存储(Parquet、ORC) |
| Schema约束 | Schema-on-Write(写入时强制) | Schema-on-Read + Schema演化 |
| ACID事务 | 原生支持 | 通过Delta/Iceberg/Hudi实现 |
| 非结构化数据 | 不支持或成本极高 | 原生支持(JSON、图片、日志) |
| 扩展性 | 垂直扩展为主,成本线性增长 | 水平扩展,存储计算分离 |
| Schema变更 | DDL锁表,重写数据 | 在线演化,无需重写 |
| 典型场景 | BI报表、固定维度分析 | 数据科学、实时分析、机器学习 |
你看,最大的区别其实在Schema变更这一行。传统数仓里改个Schema,DBA得半夜加班跑脚本。数据湖仓里,你一条ALTER TABLE下去,几秒钟就搞定了,而且不影响正在读数据的查询。
我记得有一次,业务方早上9点说要加个字段,我直接在Delta表上执行了ADD COLUMNS,10点数据就进来了,下游报表完全没感知。这在传统数仓里根本不敢想。
1.4 数据湖仓的核心架构
为了让你更直观地理解数据湖仓的架构,我画了一张图。这张图展示了数据湖仓的核心组件和它们之间的关系:
这张图里,从上到下分了三层。最上层是查询引擎,你用什么工具去读数据。中间层是事务与元数据层,这是数据湖仓的灵魂——它负责保证你读到的数据是一致的,Schema变了也能正常查询。最底层是存储层,说白了就是廉价的对象存储加上列式文件格式。
你注意看中间层和底层之间的那些格式——Delta Lake、Iceberg、Hudi。这三兄弟就是数据湖仓的具体实现。它们做的事情本质上是一样的:在Parquet文件之上维护一个事务日志,记录每一次Schema变更和数据写入。
重要提醒:不要以为用了Parquet就是数据湖仓。没有事务日志和Schema演化能力,那只是数据湖。数据湖仓的关键在于中间那一层——元数据管理和ACID事务。我见过不少团队把数据扔到S3上就号称「湖仓一体」,结果数据一致性一塌糊涂。
1.5 Schema变更在数据湖仓中的位置
最后我想强调一点:Schema变更不是数据湖仓的附加功能,而是它的核心能力。你想想看,数据湖仓要处理的数据来自几十个不同的业务系统,每个系统的Schema都在变。如果没有Schema演化,你每次都要重写整个表,那数据湖仓的「低成本」优势就荡然无存了。
在接下来的课程里,我会带你深入Delta Lake、Iceberg和Hudi的Schema变更机制,包括:
- 每种引擎支持哪些变更操作
- 变更时底层文件是怎么组织的
- 如何安全地执行生产环境的Schema变更
- 变更后如何保证下游作业不中断
嗯,这一章先到这里。记住一句话:数据湖仓的本质,就是让数据湖变得可管理、可信任。而Schema变更,是让这种可管理性落地的最关键一环。