首页/数据/数据工程与 ETL 速查/ETL 与 ELT 对比与选型
管道基础52 条

ETL 与 ELT 对比与选型

ETL 先转换后加载、转换在独立引擎完成;ELT 先把原始数据装进目标库再转换,转换下推到数仓算力。选型看目标库算力、数据形态与团队 SQL 能力。

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 能力

对比维度

维度ETLELT
转换位置独立计算引擎(如 Spark 作业)目标数仓内(SQL 执行)
对目标库要求较低,只承接转换结果较高,需要充足算力与并发
原始数据常被过滤/聚合后丢弃原件先入 ODS,可追溯
改口径成本改作业逻辑再重跑引擎改一段 SQL,回刷受影响分区
编排方式作业调度 + 引擎依赖SQL 任务 + 依赖编排(dbt 等)
典型工具DataX、Spark、Informaticadbt、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 把计算压力从独立集群搬到数仓,上线前先压测夜间批窗口:原本给报表查询的算力被加工任务占满,查询会跟着变慢。
无论转换放在哪里,抽取端都要先解决「重复与漏取」:增量水位怎么推进、写入是否幂等、失败后能否只重跑受影响分区。这些前提与形态无关,是两条路都躲不开的功课。

易错点

  • 以为 ELT 就不需要转换设计:分层边界、口径归属、幂等与重跑策略仍要提前规划,否则原件入仓后照样一片混乱
  • 直接在生产的业务库上做大范围 SELECT 或全表扫描抽取,拖慢线上业务;应走从库、加限流或按主键分批拉取
  • 把所有加工任务写成全量覆盖写入,数据量上来后批窗口跑不完,失败一次就要整表重算
  • ELT 与对外查询混用同一套资源,重算历史分区时会挤占查询算力,至少要做队列或资源组隔离

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》第 3 版 ETL 设计章节
  • dbt 官方文档:What is ELT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌