一、ETL概述与数据仓库基础
各位同学,咱们今天聊聊ETL和数据仓库。说实话,这两个词在数据领域就像「米饭」和「筷子」——天天见,但真要说清楚,很多人反而含糊了。
我刚开始做数据的时候,也踩过不少坑。有一次,业务方要一份日报,我直接从源库拉数据,跑了个SQL就交差了。结果第二天,数据对不上,业务方直接找上门来。后来我才明白——没有ETL规范,没有分层架构,数据就是一团乱麻。
1.1 ETL到底是什么?
ETL,全称是Extract-Transform-Load,翻译过来就是「抽取-转换-加载」。说白了,就是把数据从A点搬到B点,路上还得洗洗干净、整理整齐。
- 抽取(Extract):从源系统拿数据。可能是MySQL、Oracle,也可能是日志文件、API接口。
- 转换(Transform):清洗、过滤、合并、计算。这是最耗时的环节,我见过有的项目,80%的ETL代码都在做转换。
- 加载(Load):把处理好的数据写入目标库,比如数据仓库、数据集市。
核心要点:ETL不是简单的「复制粘贴」。它要解决数据质量问题、格式不一致问题、业务逻辑映射问题。你想想看,源系统里「性别」字段存的是0和1,目标系统要的是「男」和「女」,这不就得靠ETL来转吗?
1.2 数据仓库分层架构
数据仓库为什么要分层?我个人的理解是——为了「解耦」。就像盖楼,你不能把地基、墙体、装修全混在一起。数据也一样,分层之后,每一层各司其职,出了问题也好排查。
常见的分层有4层:ODS、DWD、DWS、ADS。咱们一个一个说。
ODS层(操作数据存储层)
ODS是数据仓库的「入口」。它存放的是从源系统抽取过来的原始数据,几乎不做任何加工。说白了,就是「原样照搬」。
- 数据粒度:和源系统保持一致
- 存储周期:通常是近1-3个月
- 典型操作:增量抽取、全量抽取
我的经验:ODS层的数据一定要保留原始时间戳。我曾经遇到过一次数据回溯问题,就是因为ODS层没有记录抽取时间,导致后来查不到数据变更历史。嗯,这个坑我替你们踩过了。
DWD层(明细数据层)
DWD层是「清洗后的明细数据」。这里会做数据标准化、字段映射、脏数据过滤。比如,把「2019-01-01」统一成「2019-01-01 00:00:00」,把空值处理成默认值。
-- DWD层常见操作示例
-- 清洗前:create_time 字段格式混乱
-- 清洗后:统一为 yyyy-MM-dd HH:mm:ss
SELECT
user_id,
COALESCE(gender, '未知') AS gender, -- 空值处理
TO_TIMESTAMP(create_time, 'yyyy-MM-dd HH:mm:ss') AS create_time -- 格式统一
FROM ods_user_info
WHERE is_deleted = 0; -- 过滤逻辑删除数据
DWS层(汇总数据层)
DWS层是「轻度汇总层」。按天、按小时、按维度做聚合。比如,统计每天的活跃用户数、每个品类的销售额。
为什么要有DWS层?你想想看,如果每次报表都要从DWD层几亿条数据里算汇总,那性能得多差?DWS层就是「预计算」,把常用的指标提前算好。
| 维度 | DWD层数据量 | DWS层数据量 | 查询速度对比 |
|---|---|---|---|
| 用户行为 | 10亿条/天 | 100万条/天 | 快100倍以上 |
| 订单明细 | 5000万条/天 | 50万条/天 | 快100倍以上 |
ADS层(应用数据层)
ADS层是「面向业务的数据层」。它直接服务于报表、大屏、数据产品。数据量最小,但业务价值最高。
注意:ADS层的数据一定要和业务方确认口径。我见过最惨的案例——技术团队按「下单时间」统计销售额,业务方按「支付时间」统计,结果两边数据差了20%,开会吵了一下午。所以,口径对齐比代码本身更重要。
1.3 OLTP与OLAP的区别
这两个概念,我刚开始也搞混过。后来一个老大哥跟我说了句话,我记到现在——「OLTP是干活用的,OLAP是看报表用的」。
咱们用表格对比一下:
| 对比维度 | OLTP(联机事务处理) | OLAP(联机分析处理) |
|---|---|---|
| 典型场景 | 下单、支付、登录 | 月报、趋势分析、用户画像 |
| 数据特点 | 频繁写入、少量读取 | 大量读取、很少写入 |
| 数据量级 | GB级别 | TB甚至PB级别 |
| 响应时间 | 毫秒级 | 秒级到分钟级 |
| 典型技术 | MySQL、PostgreSQL、Oracle | Hive、ClickHouse、Doris |
为什么会这样?因为OLTP要保证事务的ACID特性,每次操作都得「稳准狠」。而OLAP追求的是「快」——快速扫描大量数据,快速返回聚合结果。
我记得有一次,业务方想在MySQL上跑一个全量用户行为分析,结果跑了半小时还没出结果,直接把线上数据库拖慢了。后来我们把分析任务迁移到ClickHouse上,同样的数据,3秒出结果。这就是选错工具的代价。
1.4 小结
这一章咱们聊了三个核心概念:
- ETL:数据搬运工,但得搬得干净、搬得规范
- 数据仓库分层:ODS→DWD→DWS→ADS,每一层都有它的使命
- OLTP vs OLAP:干活用OLTP,分析用OLAP,别混着用
下一章,咱们会深入ETL的具体开发流程,包括数据抽取策略、增量与全量的选择。到时候我会分享一些我在实际项目中用过的「骚操作」,保证实用。
好了,今天就到这儿。有问题随时交流。