1. 数据工程概述

各位同学,咱们今天正式开课。

聊数据工程,绕不开一个老话题——数据到底怎么从源头搬到目标?
我见过太多团队,一上来就纠结用ETL还是ELT,结果连最基础的概念都没对齐。
说白了,地基没打牢,楼盖得再高也悬。

这一章,咱们先把地基夯实。

数据仓库基础概念

先问个问题:你手头有几十张业务表,每天几千万条记录,老板要看「上季度华东区毛利率」——你怎么查?
直接查业务库?别闹,一个慢查询就能把生产库拖死。

这就是数据仓库存在的理由。

数据仓库,说白了就是一个专门存「分析用数据」的地方。
它跟业务库最大的区别在于:

  • 面向主题:按「销售」「库存」「客户」这种分析主题组织,不是按「订单表」「商品表」这种业务流程组织。
  • 集成性:来自不同系统的数据,在这里统一编码、统一单位、统一口径。
  • 非易失性:数据一旦入库,基本只读不删不改——你想想,历史销售数据要是能随便改,审计还不炸锅?
  • 随时间变化:保留历史快照,能回答「上个月和这个月比怎么样」这类问题。

核心观点:数据仓库不是另一个数据库,而是一种数据组织方式。它的目标只有一个——让分析查询又快又准。

我记得刚入行时,有个老前辈跟我说过一句话:「业务库是拿来用的,仓库是拿来分析的。」
这么多年下来,我越来越觉得这句话值千金。

ETL与ELT的定义

好,数据有了,仓库有了,怎么把数据弄进去?
这就引出了两个经典架构:ETL 和 ELT。

名字就差一个字母,但背后的设计哲学天差地别。

ETL:先转换,再加载

Extract(抽取)→ Transform(转换)→ Load(加载)

流程很简单:
从源系统把数据抽出来,在中间层(通常是专门的ETL服务器)做完清洗、合并、聚合,最后把处理好的数据加载进数据仓库。

我早期做的一个零售项目,用的就是经典ETL。
每天晚上,从POS系统、ERP系统、CRM系统分别抽数据,在中间服务器上做字段映射、去重、计算毛利率,凌晨2点准时灌入仓库。
那时候硬件贵,仓库算力也弱,只能这么干。

-- 一个典型的ETL转换步骤(伪代码)
-- 1. 抽取
SELECT * FROM source_orders WHERE order_date = '2024-01-01';

-- 2. 转换(在ETL服务器上执行)
-- 清洗空值、统一货币单位、计算折扣后金额

-- 3. 加载
INSERT INTO dw.fact_orders (order_id, amount, currency, ...)
VALUES (...);

ELT:先加载,再转换

Extract(抽取)→ Load(加载)→ Transform(转换)

ELT把顺序调了个个儿。
先把原始数据一股脑儿倒进数据仓库,利用仓库自身的计算能力(比如Snowflake、BigQuery、Redshift的分布式算力)来做转换。

你想想看,现在云数据仓库的算力多强?
与其在中间层折腾,不如让仓库自己干。

-- ELT流程:先加载原始数据
COPY INTO raw_orders
FROM 's3://source-data/orders/2024/01/01/'
FILE_FORMAT = (TYPE = 'CSV');

-- 再在仓库内转换
CREATE TABLE dw.fact_orders AS
SELECT
  order_id,
  amount * exchange_rate AS amount_usd,
  ...
FROM raw_orders r
JOIN ref.exchange_rates e ON r.currency = e.currency;

我的建议:ETL适合数据量中等、仓库算力有限、对数据质量要求极高的场景;ELT适合数据量大、仓库算力强、团队希望快速迭代的场景。

ETL vs ELT:核心差异对比

光说定义不够直观,咱们直接上表。

对比维度 ETL ELT
转换位置 中间层(ETL服务器) 目标端(数据仓库内)
数据存储 加载前已清洗,仓库只存最终数据 仓库同时存原始数据和转换后数据
算力依赖 依赖ETL服务器 依赖数据仓库
灵活性 转换逻辑固定,改起来麻烦 原始数据在手,随时可以重新转换
数据量 适合GB~TB级 适合TB~PB级
典型工具 Informatica、Talend、DataStage dbt、Snowflake、BigQuery

这张表我建议你存一下。
以后跟团队讨论架构选型,直接拿出来对,省得扯皮。

为什么需要数据集成?

聊完概念,咱们回到一个更根本的问题——为什么非要搞数据集成?

我直接说一个真实场景吧。
之前帮一家电商公司做数据治理,发现他们的「订单金额」在三个系统里对不上:
订单系统存的是「商品总价」,财务系统存的是「实付金额」,BI报表里又算的是「含税金额」。
三个数字,三个口径,老板开会问「这个月到底卖了多少钱」,没人能说清楚。

这就是数据孤岛。

数据集成要解决的,就是这个问题:

  • 消除孤岛:把散落在各个系统里的数据打通。
  • 统一口径:同一个指标,同一个算法,同一个结果。
  • 提升时效:从T+1到T+0,甚至实时。
  • 降低成本:别让分析师花80%的时间在「找数据、对数据」上。

注意:数据集成不是「把数据堆在一起」就完事了。我曾经见过一个项目,把20个系统的数据全塞进一个表,结果字段超过500个,查询一次要5分钟——这叫数据沼泽,不叫数据仓库。

本章知识体系总览

下面这张图,把咱们这一章的核心逻辑串起来了。
你可以把它当作整个课程的地图——后面每一章,都会在这张图上展开。

数据工程基础:ETL与ELT知识体系 数据工程基础:ETL与ELT知识体系 数据源 业务库 / 日志 / API 抽取 (Extract) 全量 / 增量 / CDC 转换 (Transform) 在中间层执行 加载 (Load) 写入数据仓库 加载 (Load) 原始数据入仓 转换 (Transform) 在仓库内执行 数据仓库 分析就绪数据 ETL:先转换后加载 → 适合数据质量要求高、仓库算力有限的场景 ELT:先加载后转换 → 适合数据量大、仓库算力强、需要灵活迭代的场景

从这张图可以看得很清楚:
ETL和ELT的起点一样——都是数据源,都是先抽取。
但到了中间环节,一个向左走(先转换),一个向右走(先加载)。
最终都汇入数据仓库,但路径不同,带来的灵活性、性能、维护成本也完全不同。

嗯,这一章的内容就到这儿。
概念清楚了,后面咱们再深入每个环节的实战细节。