上一篇我们介绍了数据平台如何通过全量同步、增量同步、CDC 等方式,把业务系统中的数据采集到平台。
但数据进入平台并不意味着可以直接使用。
业务系统里的数据通常是为"业务运行"服务的,数据结构、字段格式甚至数据质量都不一定适合直接做分析。比如用户表里的手机号格式不统一,订单表存在重复数据,不同系统里的用户 ID 不一样,这些问题都会影响后面的统计分析。
所以,数据进入平台之后,还需要经过一个非常重要的环节:数据处理。
而说到数据处理,就绕不开 ETL。
一、ETL 到底是什么?
ETL 是 Extract、Transform、Load 三个单词的缩写。
简单理解就是:
css
Extract 提取数据
↓
Transform 转换数据
↓
Load 加载数据
也就是先把数据拿过来,然后对数据进行清洗和转换,最后写入目标存储。
例如一个电商平台每天产生大量订单数据:
MySQL
↓
提取订单数据
↓
清洗、转换、关联
↓
数据仓库
↓
BI 报表
这就是一个非常典型的 ETL 流程。
二、Extract:先把数据取出来
ETL 的第一步是 Extract,也就是从数据源中提取数据。
数据源可能是 MySQL、PostgreSQL、Oracle,也可能是日志文件、CSV、第三方 API,甚至是其他数据平台。
例如从 MySQL 中获取订单数据:
sql
SELECT
id,
user_id,
amount,
status,
created_at
FROM orders;
对于数据量比较小的场景,直接查询数据库可能就够了。
但如果每天有几千万甚至上亿条数据,就不能简单地每天把所有数据重新查询一遍。
这时候通常会结合前面讲到的增量同步和 CDC,只获取发生变化的数据。
所以,数据采集和 ETL 并不是完全独立的两个东西,它们在实际的数据平台中往往会连接起来。
三、Transform:真正复杂的地方来了
ETL 中最重要、也最容易产生复杂业务逻辑的部分,通常是 Transform,也就是数据转换。
因为业务系统中的原始数据,往往不能直接拿来分析。
比如:
ini
原始数据
user_id = 10001
gender = 1
amount = "128.50"
created_at = "2026-09-26 10:20:00"
经过处理之后可能变成:
ini
user_id = 10001
gender = "男"
amount = 128.50
date = "2026-09-26"
这个过程中可能涉及很多操作。
最常见的是数据清洗,例如处理空值、异常值、错误格式等。
其次是数据去重。业务系统可能因为重复提交、网络重试等原因产生重复数据,需要在数据处理阶段进行识别和处理。
还有数据格式统一 。例如一个系统使用 male/female,另一个系统使用 1/0,如果最终需要统一分析,就需要转换成统一的数据标准。
除此之外,还经常需要进行数据关联。
例如订单表只有:
order_id
user_id
amount
但是报表需要看到:
订单号
用户名称
用户所在城市
订单金额
那么就需要把订单数据和用户数据关联起来。
四、数据聚合也是 ETL 的重要工作
数据平台不仅需要保存明细数据,还经常需要提前计算一些统计结果。
例如原始订单数据:
订单1 100
订单2 200
订单3 300
订单4 150
经过聚合之后,可以得到:
今日订单数:4
今日销售额:750
平均订单金额:187.5
SQL 中最常见的聚合操作就是:
vbnet
SELECT
DATE(created_at) AS date,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY DATE(created_at);
这样原本大量的订单明细,就可以转换成更加适合分析的统计数据。
这也是为什么数据平台里的 SQL 能力非常重要。很多数据处理逻辑,本质上就是对数据进行筛选、关联、转换和聚合。
五、Load:处理完的数据放到哪里?
Transform 完成之后,就到了 Load,也就是把处理后的数据加载到目标系统。
目标可能是:
数据仓库
数据湖
ClickHouse
Hive
Iceberg
其他分析数据库
具体选择取决于业务场景。
例如:
MySQL
↓
数据采集 / CDC
↓
Kafka
↓
ETL 数据处理
↓
ClickHouse
↓
BI 报表
也可能是:
业务数据库
↓
数据采集
↓
数据处理
↓
数据湖
↓
数据仓库
↓
数据分析
所以 ETL 并不是某一个具体的软件,而是一种数据处理流程和思想。
六、ETL 和 ELT 有什么区别?
学习数据平台时,还经常会看到一个词:ELT。
ETL 是:
css
Extract
↓
Transform
↓
Load
也就是先转换,再加载。
ELT 则是:
css
Extract
↓
Load
↓
Transform
先把原始数据加载到数据仓库或者数据湖,然后再利用目标系统的计算能力进行转换。
现在很多现代数据平台都会采用 ELT 的思路。
原因也比较简单:现在的数据仓库、数据湖以及各种分析引擎计算能力越来越强,没必要所有数据都在进入存储之前处理完。
例如:
sql
MySQL
↓
采集
↓
数据湖
↓
SQL / Spark / Flink
↓
数据处理
↓
分析数据
这样可以尽可能保留原始数据,后面如果业务规则发生变化,还可以重新计算。
所以 ETL 和 ELT 并不是谁一定替代谁,而是根据数据规模、实时性和架构设计进行选择。
七、批处理和实时处理
数据处理还可以简单分成两种模式:批处理和实时处理。
批处理就是积累一批数据之后统一处理。
例如每天凌晨:
makefile
00:00
↓
处理昨天所有订单
↓
生成日报
这种方式比较简单,适合日报、月报等对实时性要求不高的场景。
实时处理则是数据产生之后很快进行处理。
例如:
用户下单
↓
Kafka
↓
Flink
↓
实时计算
↓
实时大屏
用户刚刚下了一笔订单,几秒之后数据就可能出现在实时销售大屏上。
因此,ETL 不仅仅是"写几个 SQL",真正的数据平台还需要考虑数据量、处理速度、任务调度、失败重试以及数据一致性等问题。
八、一个简单的数据处理案例
假设现在有一个电商平台,需要每天生成销售报表。
业务数据库中有两张表:
bash
users
orders
订单表:
order_id
user_id
amount
created_at
用户表:
user_id
name
city
数据平台首先通过 CDC 获取订单和用户数据,然后进入 Kafka。
接下来进行数据处理:
订单数据
↓
过滤异常订单
↓
去重
↓
关联用户
↓
按日期、城市聚合
↓
生成销售统计
最终得到:
yaml
日期 城市 订单数 销售额
2026-09-26 深圳 1200 235000
2026-09-26 广州 980 182000
2026-09-26 上海 1500 310000
BI 工具只需要读取这些处理后的数据,就可以生成各种报表和图表。
这就是数据平台最典型的一条数据处理链路。
九、数据处理最难的其实不是 SQL
刚开始学习数据平台,很容易觉得 ETL 就是写 SQL。
SQL 确实非常重要,但真正进入生产环境后,会发现问题远不止 SQL。
例如任务执行到一半失败了怎么办?
数据重复处理怎么办?
昨天的数据被修改了怎么办?
上游数据没有到达怎么办?
数据处理完成了,但是部分数据写入失败怎么办?
不同数据源的数据标准不一致怎么办?
这些问题都会涉及任务调度、数据质量、幂等、重试、监控、数据治理等内容。
所以数据开发并不是单纯的"写 SQL",而是围绕数据整个生命周期进行开发。
十、把 ETL 放回整个数据平台来看
到这里,我们可以把前面几篇文章串起来:
业务系统
↓
数据采集
↓
全量 / 增量 / CDC
↓
Kafka
↓
ETL / ELT
↓
数据仓库 / 数据湖
↓
BI / 数据分析
上一篇解决的是:
数据怎么进入平台?
这一篇解决的是:
数据进入平台之后怎么变成可用的数据?
下一步就会遇到一个非常自然的问题:
处理好的数据到底应该存在哪里?
这就涉及数据仓库和数据湖。
总结
ETL 是数据平台中非常核心的一环,它负责把业务系统中的原始数据,经过提取、清洗、转换、关联和聚合,最终变成可以用于分析的数据。
如果把数据平台比作一座工厂,那么数据采集负责把原材料运进来,ETL 就是在工厂里加工这些原材料,而数据仓库和数据湖则负责把加工前后的数据保存下来。
理解了这条链路,再去学习 Spark、Flink、Hive、Airflow 等具体技术,就会容易很多。