ETL 与 ELT 是什么
ETL(Extract-Transform-Load)先抽取、在独立计算引擎里转换、再把结果加载进目标库;ELT(Extract-Load-Transform)先把原始数据原样装进目标库,再用目标库自身的算力做转换。两者处理的是同一件事——把源系统的数据加工成可用数据,差别只在转换发生在哪里。
为什么转向 ELT
云数仓与湖仓把存储与计算解耦、扩容按需,目标库算力不再是瓶颈,于是把转换下推成 SQL 更省事:数据不必为适配某个引擎反复搬运,原始数据保留下来还能随时改口径重算。这是 ELT 在云上成为默认形态的直接原因。
基本信息
| 全称 | Extract-Transform-Load / Extract-Load-Transform |
|---|---|
| 转换位置 | ETL 在独立引擎;ELT 在目标数仓内 |
| 原始数据 | ETL 常不留原件;ELT 先落贴源层 |
| 代表实现 | ETL:DataX、Spark、Informatica;ELT:dbt、Flink SQL、数仓内调度 SQL |
| 选型关键 | 目标库算力、数据形态、团队 SQL 能力 |
对比维度
| 维度 | ETL | ELT |
|---|---|---|
| 转换位置 | 独立计算引擎(如 Spark 作业) | 目标数仓内(SQL 执行) |
| 对目标库要求 | 较低,只承接转换结果 | 较高,需要充足算力与并发 |
| 原始数据 | 常被过滤/聚合后丢弃 | 原件先入 ODS,可追溯 |
| 改口径成本 | 改作业逻辑再重跑引擎 | 改一段 SQL,回刷受影响分区 |
| 编排方式 | 作业调度 + 引擎依赖 | SQL 任务 + 依赖编排(dbt 等) |
| 典型工具 | DataX、Spark、Informatica | dbt、Flink SQL、调度器里的加工 SQL |
典型使用场景
- 自建数仓、目标库算力紧张:先在 Spark 侧把大表关联与聚合算完再入库,选 ETL
- 云数仓上做 ODS/DWD/DWS 分层加工:用 ELT 让转换贴着数据走,省掉中间搬运
- 半结构化数据(日志、JSON)入库前要解析与规范化:ETL 阶段完成结构对齐
- 合规要求保留原始数据、口径需随时重算:ELT 先落后算,重算不依赖源系统
- 团队以 SQL 为主、没有 Java/Scala 开发资源:ELT 的落地成本明显更低
- 源库压力敏感:抽取阶段只做轻量过滤与脱敏,重加工放到数仓
两条路径示意
两条路径示意
# ETL:转换在独立引擎完成,目标库只接结果
源库 → 抽取 → Spark 清洗/关联/聚合 → 写入数仓结果表
# ELT:原件先入仓,转换下推到数仓
源库 → 原样入 ODS(保留全部字段)→ 数仓内 SQL 逐层加工 DWD/DWS → ADS
# 关键差别:ELT 链路里 ODS 是可回溯的事实来源,ETL 链路里中间态通常在引擎侧就没落了ELT 的转换长什么样
ELT 的转换长什么样
-- ODS 原样落地,不改字段
INSERT OVERWRITE TABLE ods_order PARTITION (dt = '2026-10-11')
SELECT id, user_id, total_amount, status, update_time FROM src_order WHERE update_time >= '2026-10-11 00:00:00';
-- 口径在数仓内用 SQL 实现,改口径只改这一段
INSERT OVERWRITE TABLE dwd_trade_order_di PARTITION (dt = '2026-10-11')
SELECT order_id, user_id, CAST(total_amount AS DECIMAL(18,2)) AS pay_amount, status
FROM ods_order WHERE dt = '2026-10-11';ELT 不是让转换消失,而是把它变成数仓内的 SQL 任务:依赖编排、幂等、失败重跑、口径版本管理一样都不能少。
两种形态常混合使用:抽取阶段用 ETL 做轻清洗(脱敏、单位统一、类型规范),入仓后按 ELT 做业务口径加工,兼顾源库压力与改口径成本。
怎么选
判断顺序建议是:先看目标库能否承担加工(云数仓通常可以),再看转换是否需要非 SQL 能力(复杂文本解析、特征计算、外部接口调用),最后看团队技能栈。多数场景的答案是「抽取阶段做轻 ETL,库内做 ELT」——源库压力与改口径成本同时被照顾到。
ELT 把计算压力从独立集群搬到数仓,上线前先压测夜间批窗口:原本给报表查询的算力被加工任务占满,查询会跟着变慢。
无论转换放在哪里,抽取端都要先解决「重复与漏取」:增量水位怎么推进、写入是否幂等、失败后能否只重跑受影响分区。这些前提与形态无关,是两条路都躲不开的功课。