大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
数据采集与 ETL
ETL(Extract → Transform → Load)是批处理数据管道的经典模式;现代栈也常写 ELT(先加载到数仓再 SQL 转换)。本课建立批处理采集的设计直觉。
学习目标
- 理解 Extract / Transform / Load 各阶段职责
- 掌握全量、增量、快照等批处理模式
- 能设计一个从 MySQL 到 staging 表的日常任务
ETL 三阶段
Extract — 从源系统读(JDBC、API、文件、日志)
Transform — 清洗、类型统一、去重、业务规则
Load — 写入 staging / warehouse / mart
| 阶段 | 常见坑 |
|---|---|
| Extract | 源库压力大、漏增量水位 |
| Transform | 时区、NULL、重复键 |
| Load | 非幂等重跑导致重复行 |
幂等是批处理第一原则:同一 DAG 跑两次,结果应与跑一次一致(MERGE / DELETE+INSERT 分区)。
批处理模式
| 模式 | 适用 | 示例 |
|---|---|---|
| 全量刷新 | 小维表 | 每日覆盖 dim_track |
| 增量追加 | 大事实表 | WHERE updated_at >= yesterday |
| 快照 | 历史对比 | 每日用户余额快照 |
| 拉链表 | 缓慢变化 | 课程价格历史(见 de-modeling) |
Extract 实现方式
# 伪代码:JDBC 增量拉取
watermark = get_last_run("tracks_etl")
df = pd.read_sql(
"SELECT * FROM cf_track WHERE updated_at > %s",
conn, params=[watermark]
)
load_to_staging(df, "stg_tracks")
set_last_run("tracks_etl", max(df.updated_at))
生产环境常用 Airflow Operator 或 Fivetran/Airbyte 托管;本站练习可 Python + cron,编排见下一课。
Transform 放在哪
| 策略 | 优点 | 工具 |
|---|---|---|
| ETL(管道内 Python/Spark) | 源端减压 | pandas, Spark |
| ELT(数仓内 SQL) | 利用数仓算力 | dbt, 原生 SQL |
CodeRoadMap 规模下 ELT + dbt 足够;海量日志再考虑 Spark。
与路线图的关系
- /roadmaps/data-engineer — ETL / Batch 节点
- de-orchestration — 调度 Airflow
- /tracks/sql-essentials — Load 后的 SQL 转换
练习
- 为
cf_track设计增量 ETL:列出 Extract SQL 与 staging 表字段 - 说明任务失败重跑时如何避免重复数据
- 对比 ETL 与 ELT,各写一条适用场景
小结
Extract 要轻、Transform 要准、Load 要幂等;批处理是数仓的主粮。 下一课用 Airflow/dbt 编排这些步骤。