概述
ETL(Extract-Transform-Load)是一种数据集成过程,常用于数据仓库、数据分析、数据清洗等场景。ETL的主要目标是从不同数据源提取数据,进行清洗、转换,然后加载到目标数据仓库或分析系统。
ETL所描述的过程,一般常见的作法包含ETL或是ELT,并且混合使用。通常越大量的数据、复杂的转换逻辑、目的端为较强运算能力的数据库,越偏向ELT,以便运用目的端数据库的平行处理能力。
ETL 常用的三种实现方法
-
借助ETL工具(如Oracle的OWB、SQL Server 2000的DTS、SQL Server 2005的SSIS服务、Informatic等)实现
-
SQL实现
-
ETL工具和SQL结合。
借助工具可以快速的建立起ETL工程,屏蔽了复杂的编码任务,提高了速度,降低了难度,但是缺少灵活性。SQL方法灵活,提高ETL运行效率,但是编码复杂,对技术要求比较高。
注:
数据仓库(Data Warehouse)是一种面向分析和决策支持的数据库系统
Extract
主要针对各个业务系统不同服务器的分散数据,充分理解数据定义后,规划需要的数据源及数据定义,制定可操作的数据源,制定增量抽取和缓慢渐变的规则。
提取是把多种多样的原格式数据抽象出来,形成统一的数据格式先放入缓存区,不会直接进入数据仓库,等待下一步转换操作。
数据的抽取是从各个不同的数据源抽取到ODS(Operational Data Store,操作型数据存储)中
调研
首先,要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS,是否存在手工数据,手工数据量是多大,是否存在非结构化数据等,当收集完这些信息之后才可以进行数据抽取的设计。
分类
与存放DW的数据库系统相同的数据源
一般情况下,DBMS(SQL Server、Oracle)都会提供数据库链接功能,在DW数据库服务器和原业务系统之间建立直接的链接关系就可以写Select语句直接访问。
与DW数据库系统不同的数据源
一般情况下,可以通过ODBC的方式建立数据库链接------如SQL Server和Oracle之间。如果不能建立数据库链接,可以有两种方式完成,一种是通过工具将源数据导出成.txt或.xls文件,然后再将这些源系统文件导入到ODS中,另外一种方法是通过程序接口完成。
增量抽取
-
基于时间戳
适用:数据库记录更新频繁,如 EMR 电子病历数据
-
基于主键自增
适用:数据库主键递增的数据表,如患者挂号数据
-
基于数据日志
监听数据库日志捕获变更数据
适用:高并发数据抽取,如 Kafka 实时流处理
全量抽取
每次抽取所有数据,无需考虑数据是否已更新
Extract 的工具
不同场景可以选择不同的 ETL 工具进行数据抽取:
工具 | 特点 | 适用场景 |
---|---|---|
Python + Pandas | 适用于小规模数据抽取 | 处理 CSV, Excel, JSON, API 数据 |
Airflow | 定时调度批量 ETL 任务 | BI 报表数据抽取 |
Talend | 可视化 ETL 工具 | 数据仓库构建 |
Flink / Spark Streaming | 实时数据流处理 | Kafka, 实时数据库日志 CDC |
Logstash | 适用于日志数据抽取 | 服务器日志,ELK 生态 |
DBT(Data Build Tool) | 适用于 SQL 数据变换 | 数据仓库 ETL |
注
ODBC(Open Database Connectivity)开放数据库连接,是一种数据库访问接口,用于让不同的软件能够访问不同类型的数据库,而不需要针对每种数据库写特定的代码。
Transform
Transform负责对数据进行清洗、格式转换、聚合、标准化等操作,以便数据能够正确加载到数据仓库或数据湖,并适用于分析或机器学习任务
操作
类别 | 说明 | 示例 |
---|---|---|
数据清洗(Cleaning) | 处理空值、去重、修正错误数据 | 去掉 NULL 值、填充缺失数据 |
数据标准化(Standardization) | 统一不同来源的数据格式 | YYYY/MM/DD → YYYY-MM-DD |
数据类型转换(Type Conversion) | 统一数据类型,避免计算错误 | "123" (字符串) → 123 (整数) |
数据去重(Deduplication) | 删除重复数据,保持唯一性 | 同一个订单号重复出现,去重 |
数据拆分 & 合并(Splitting & Merging) | 拆分列、合并列,调整数据结构 | full_name → first_name + last_name |
数据派生(Derivation) | 计算新字段 | total_price = quantity * unit_price |
数据映射(Mapping) | 用标准值替换非标准值 | M → Male , F → Female |
数据聚合(Aggregation) | 按维度分组统计 | 按 customer_id 统计 total_orders |
数据编码(Encoding) | 数据脱敏、哈希处理 | 手机号加密 138****5678 |
Load
加载方式
全量加载(Full Load)
🔸 概念 :每次都清空目标表,然后重新加载所有数据。
🔸 适用场景 :数据量小,或者数据每次都需要完整更新的情况。
🔸 缺点:如果数据量大,性能开销高,且会影响系统可用性。
适用场景
- 初次数据迁移
- 业务数据不涉及实时更新
- 目标系统数据库不支持增量更新
增量加载(Incremental Load)
🔸 概念 :只加载自上次更新以来的新增或变更数据,常使用时间戳或主键进行增量判断。
🔸 适用场景 :数据量大,且需要高效更新的情况。
🔸 优势:减少数据重复加载,提高效率。
批量加载(Batch Load)
🔸 方式 :数据按一定大小分批插入,而不是一次性全部加载。
🔸 适用场景:大数据量 ETL,避免占用过多数据库资源。
流式加载(Streaming Load)
🔸 方式 :数据实时或准实时插入目标数据库,常用于大数据流处理。
🔸 适用场景 :数据需要实时更新,如日志分析、IoT 数据。
🔹 工具:Kafka + Flink、Airflow、DataFlow
覆盖加载(Overwrite Load)
🔸 方式:用新数据替换目标表中的旧数据(不会删除数据,而是更新)。
合并加载(Upsert Load)
🔸 方式 :如果数据已存在则更新,否则插入新数据(INSERT + UPDATE 组合)。