DWD 是什么
DWD(Data Warehouse Detail)是明细数据层,保存业务过程最细粒度的事实,粒度原则是「一行一事」——一行订单、一行支付、一行退款。它夹在贴源层与汇总层之间,承担三类固定动作:去重、字段格式与枚举标准化、关联维度代理键。DWD 保留明细的意义在于可回溯:指标异常时能回到单据级核对,而不是只剩一个汇总数字无从下手。
基本信息
| 粒度 | 业务过程最细,一行一事 |
|---|---|
| 主要动作 | 去重、类型转换、枚举标准化、代理键关联 |
| 命名 | dwd_域_过程_周期,如 dwd_trade_order_di |
| 周期后缀 | di 日全量、df 日增量、i 小时级 |
典型使用场景
- 口径对不齐时回到明细逐单核对,判断是清洗写错还是汇总写错
- 下游 DWS 与 ADS 统一从 DWD 取数,避免各自重复 JOIN 源表
- 需要下钻分析(某笔订单为什么没算进 GMV)时提供单据级记录
- 数据质量追溯:DWD 保留业务主键,可与源系统逐行比对定位差异
- 作为对外数据服务的可审计底稿,报表数字能被追溯到具体单据
DWD 加工骨架
DWD 加工骨架
INSERT OVERWRITE TABLE dwd_trade_order_di PARTITION (dt='2026-10-13')
SELECT o.order_id, -- 业务主键,保留以便回溯
o.user_id,
COALESCE(d.customer_sk, -1) AS customer_sk, -- 维度代理键,缺失填 -1
CAST(o.pay_amt AS DECIMAL(18,2)) AS pay_amt, -- 统一金额类型与精度
COALESCE(m.std_code,'UNKNOWN') AS order_status -- 枚举标准化,走映射表
FROM (SELECT *, row_number() OVER (PARTITION BY order_id ORDER BY etl_load_time DESC) AS rn
FROM ods_order WHERE dt='2026-10-13') o -- 同单据多次落地时取最新
LEFT JOIN dim_customer d ON o.user_id = d.customer_id AND d.is_current=1
LEFT JOIN dim_code_map m ON o.order_status = m.src_code AND m.code_type='order_status'
WHERE o.rn = 1;常见清洗动作
| 动作 | 做法 | 不做会怎样 |
|---|---|---|
| 去重 | 按业务主键 row_number 取最新一条 | 同单据重复计入,指标虚高 |
| 类型统一 | 金额转 DECIMAL、时间戳统一时区 | 下游比较与汇总出现精度或时区偏差 |
| 枚举标准化 | 源枚举经映射表转标准码,未知填 UNKNOWN | 同一状态多种写法,统计被拆成多份 |
| 代理键关联 | LEFT JOIN 维表取 sk,缺失填 -1 | 用 INNER JOIN 会静默丢单,行数对不上 |
枚举映射建议落成映射表(如 dim_code_map),SQL 引用映射表而不是在每个脚本里硬编码 CASE WHEN:新增枚举时只改映射数据,不用回头改所有下游脚本。
DWD 的字段口径一旦对外承诺就属于契约。上线后新增字段应可空、可缺省;删除或改名要走变更流程,否则下游脚本会在某天凌晨集中报错。