数据处理完放在哪里?一文搞懂数据仓库与数据湖

上一篇我们介绍了 ETL。数据从业务系统进入数据平台之后,需要经过清洗、转换、关联和聚合,才能真正变成可以分析的数据。

但处理完之后还有一个问题:

这些数据到底放在哪里?

如果只是把数据继续放回 MySQL,似乎也可以查询,但随着数据量越来越大,分析场景越来越复杂,传统业务数据库就很难承担这个任务。

于是,数据平台中出现了两个非常重要的概念:数据仓库和数据湖。

一、为什么不能直接用 MySQL 做数据分析?

先看一个比较简单的场景。

一家电商公司使用 MySQL 保存订单:

bash 复制代码
users
orders
products
payments

平时业务系统查询的是:

ini 复制代码
SELECT *
FROM orders
WHERE user_id = 10001;

这种查询数据量通常不大,而且主要是服务于具体业务。

但是数据分析可能会执行这样的 SQL:

scss 复制代码
SELECT
    city,
    DATE(created_at),
    SUM(amount),
    COUNT(*)
FROM orders
GROUP BY city, DATE(created_at);

甚至还需要关联几十张表,统计几年甚至几十亿条数据。

这类分析查询可能会消耗大量 CPU、内存和磁盘 I/O。

如果直接在生产 MySQL 上运行,可能影响正常的订单、支付和用户请求。

所以数据平台通常会把业务数据同步到专门用于分析的存储系统。

这就是数据仓库出现的重要原因之一。

二、数据仓库到底是什么?

数据仓库,英文叫 Data Warehouse,简称 DW。

可以简单理解为:

专门为数据分析和统计而建设的数据存储系统。

业务数据库关注的是:

复制代码
用户注册
下单
支付
发货
退款

数据仓库关注的是:

复制代码
今天卖了多少钱?
哪个城市销售额最高?
用户复购率是多少?
过去一年销售趋势怎么样?

两者的目标并不一样。

可以简单理解成:

markdown 复制代码
业务数据库
      ↓
负责业务运行

数据仓库
      ↓
负责数据分析

所以数据仓库并不是简单地把 MySQL 换成另一个数据库,而是针对分析场景重新组织数据。

三、数据仓库里的数据是什么样的?

假设业务系统中有订单表:

复制代码
orders

order_id
user_id
product_id
amount
created_at

数据仓库可能会围绕分析需求重新设计数据模型。

例如:

复制代码
事实表
fact_order

订单金额
订单数量
商品数量
用户 ID
商品 ID
时间 ID

再配合:

复制代码
维度表
dim_user
dim_product
dim_date

这样就可以从不同维度分析订单。

比如:

复制代码
按时间统计
按城市统计
按用户统计
按商品统计
按渠道统计

这也是数据仓库和业务数据库一个很大的区别。

业务数据库通常围绕业务功能设计,而数据仓库通常围绕分析需求设计。

四、什么是数据湖?

数据仓库解决了结构化数据的分析问题,但数据平台继续发展之后,又遇到了新的问题。

现实中的数据并不只有 MySQL 表。

还有:

javascript 复制代码
日志
JSON
CSV
图片
音频
视频
IoT 数据
第三方 API
半结构化数据

这些数据如果全部提前整理成数据仓库需要的结构,会非常麻烦。

于是就出现了数据湖(Data Lake) 。

数据湖可以简单理解为:

一个能够保存大量原始数据、结构化数据、半结构化数据甚至非结构化数据的数据存储平台。

它更强调:

先把数据保存下来,再根据后续需求进行处理和分析。

例如:

javascript 复制代码
MySQL 数据
日志
JSON
CSV
IoT
API
   ↓
数据湖
   ↓
后续处理

这和传统数据仓库"先整理、再存储"的思路存在一定区别。

五、数据仓库和数据湖有什么区别?

可以先用一个简单的方式理解:

对比 数据仓库 数据湖
数据 主要是结构化数据 结构化、半结构化、非结构化
数据状态 通常经过处理 可以保存原始数据
结构 相对固定 更灵活
主要用途 BI、报表、分析 大规模数据存储与处理
数据处理 通常先处理再存 可以先存后处理

比如公司每天产生 1TB 日志。

如果全部先转换成固定的数据表,再保存下来,开发成本可能比较高。

数据湖可以先把原始日志保存下来:

复制代码
原始日志
   ↓
数据湖
   ↓
需要分析的时候再处理

这样就可以保留更多原始数据。

六、数据湖是不是比数据仓库更先进?

不能简单这么理解。

它们解决的问题不同。

数据仓库更强调:

数据经过整理之后,为分析提供稳定的数据结构。

数据湖更强调:

大量数据先保存下来,同时保留原始数据和灵活处理能力。

所以实际企业里经常不是二选一。

可能是:

复制代码
业务系统
   ↓
数据采集
   ↓
数据湖
   ↓
数据处理
   ↓
数据仓库
   ↓
BI

数据湖保存原始数据,数据仓库保存经过加工、适合分析的数据。

两者可以同时存在。

七、什么是 Data Lakehouse?

学习数据平台的时候,还会经常看到一个新的概念:

Data Lakehouse,数据湖仓。

它试图把数据湖和数据仓库的一些能力结合起来。

简单理解就是:

diff 复制代码
数据湖
+
数据仓库
=
Lakehouse

它希望既能够像数据湖一样保存大量原始数据,又能够提供类似数据仓库的数据管理、事务和分析能力。

现在很多现代数据平台都会围绕 Lakehouse 架构建设。

其中经常会看到:

复制代码
Apache Iceberg
Apache Hudi
Delta Lake

这些技术主要解决数据湖中的表格式、事务、更新、版本管理等问题。

对于刚开始学习数据平台的人来说,不需要马上深入这些技术。

先理解:

数据仓库解决分析问题,数据湖解决大规模、多类型数据存储问题,Lakehouse 尝试把两者结合起来。

八、数据到底应该怎么存?

假设现在有一个电商平台。

每天产生:

复制代码
订单数据
用户数据
商品数据
访问日志
支付数据
推荐数据

可以设计成:

markdown 复制代码
                    ┌── 数据仓库 ──→ BI
                    │
业务系统 → 数据采集 → 数据湖
                    │
                    └── 数据处理 → 实时分析

原始数据进入数据湖保存。

经过 ETL / ELT 处理之后,可以把适合分析的数据写入数据仓库。

最后 BI 工具从数据仓库中读取数据,生成报表和数据看板。

这样一来,整个数据链路就越来越清晰了。

九、常见的数据仓库和数据湖技术

了解概念之后,再来看技术就比较容易了。

数据仓库领域经常会看到:

复制代码
Hive
ClickHouse
Snowflake
BigQuery
Redshift

数据湖相关技术则可能看到:

复制代码
S3
HDFS
Iceberg
Hudi
Delta Lake

数据处理过程中还可能结合:

复制代码
Spark
Flink
Trino

数据平台最终可能是这些技术组合起来的,而不是只使用某一个产品。

例如:

复制代码
MySQL
 ↓
Kafka
 ↓
Flink
 ↓
Iceberg
 ↓
Trino
 ↓
BI

也可能是另一套技术组合。

所以学习数据平台时,不应该一开始就陷入"到底应该学哪个框架"。

更重要的是先理解每个组件在整个数据链路中的位置。

十、从整个数据平台重新看数据仓库和数据湖

现在把前面几篇文章放到一起:

复制代码
业务系统
   ↓
数据采集
   ↓
全量 / 增量 / CDC
   ↓
Kafka
   ↓
ETL / ELT
   ↓
数据湖 / 数据仓库
   ↓
数据分析 / BI

第一篇我们认识了数据平台。

第二篇解决了数据怎么进入平台。

第三篇解决了数据进入之后怎么处理。

这一篇解决了:

处理好的数据应该放在哪里。

到这里,数据平台的基本骨架已经出来了。

接下来还需要把这些组件真正串起来,看看一条数据从业务系统产生,到最终进入 BI 报表,中间到底经历了什么。

这也是下一篇要解决的问题。

总结

数据仓库和数据湖都是数据平台的重要组成部分。

数据仓库主要面向结构化数据分析,强调经过整理的数据和稳定的分析模型;数据湖则更加关注大规模、多类型以及原始数据的存储。

实际企业中,两者往往会结合使用,再配合 Kafka、Flink、Spark、Iceberg、ClickHouse 等技术,形成完整的数据平台架构。

真正学习数据平台,不是把这些技术一个个背下来,而是要理解:

数据为什么从这里流向那里,以及每一个组件到底解决了什么问题。

相关推荐
IT_陈寒1 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
Thneonl1 小时前
Celery 生产踩坑:1000 任务积压与 acks_late 双重执行
后端·python
卷福同学1 小时前
第一次当面试官有感
后端·面试
苏三说技术1 小时前
为什么越来越多人用 OnlyOffice?
后端
知守观1 小时前
@Transactional 事务失效排查,try-catch 吞异常导致回滚失败(附源码分析)
后端·spring
羑悻1 小时前
Codex + Seed-2.1-pro 实测:多模态理解 + Coding Agent 能扛住真实仓库吗?
后端
颜进强1 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
小小张说故事1 小时前
Python 多线程为什么跑不快?asyncio 入门指南:异步并发从零上手
后端·python
明月_清风1 小时前
数据进入平台后怎么处理?一文搞懂 ETL
大数据·后端·数据分析
初学AI的小高1 小时前
LangGraph断点恢复与幂等执行实战
后端·架构