数据进入平台后怎么处理?一文搞懂 ETL

上一篇我们介绍了数据平台如何通过全量同步、增量同步、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 等具体技术,就会容易很多。

相关推荐
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
初学AI的小高1 小时前
LangGraph断点恢复与幂等执行实战
后端·架构