清洗规则清单是什么
DWD 清洗规则清单是把「数据要变成什么样」显式写下来的地方,常见动作有六类:主键去重(同一单据保留最新批次)、字符串首尾空格清理、日期格式统一、枚举值标准化、非法或缺失值归入未知成员、金额精度对齐。规则集中管理才能被复现——如果清洗只散落在各个脚本的 CASE 分支里,出问题时没人说得清某一行数据到底被改成了什么。
基本信息
| 去重 | 按主键加装载时间取最新批次 |
|---|---|
| 格式 | 去空格、日期与类型统一 |
| 枚举 | 通过映射表标准化,未知值填 UNKNOWN |
| 异常 | 非法值归入未知成员,而不是丢弃 |
| 管理方式 | 规则落成映射表或配置,便于复现 |
典型使用场景
- 同一单据多次变更:按主键取最新批次,避免下游重复计算
- 源系统脏数据:首尾空格、全角半角混用,先清理再做关联
- 枚举口径统一:源状态码经映射表转标准码,统计不再分裂
- 金额字段:统一为定点小数并约定精度,避免误差累积
- 类型转换失败的行:归入未知成员并单独统计,而不是静默丢弃
规则与后果
| 规则 | 做法 | 不做会怎样 |
|---|---|---|
| 主键去重 | 按装载时间倒序取第一条 | 同单据重复计入,指标虚高 |
| 空白清理 | 清理首尾空格,统一全角半角 | 关联不上维表,出现意外的空值 |
| 日期统一 | 多种格式转为同一日期类型 | 同一日期多种写法,分组被拆散 |
| 枚举标准化 | 源码经映射表转标准码,未知填 UNKNOWN | 同一状态多种写法,口径分裂 |
| 精度对齐 | 金额统一为定点小数并约定小数位 | 浮点累加误差,对账差额无法解释 |
去重与格式化
去重与格式化
SELECT order_id,
trim(cust_name) AS cust_name, -- 去掉首尾空格
to_date(replace(birth_dt,'/','-')) AS birth_date, -- 日期格式统一为 yyyy-MM-dd
COALESCE(m.std_code,'UNKNOWN') AS order_status -- 枚举标准化,未知归入 UNKNOWN
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') t
LEFT JOIN dim_code_map m ON t.order_status = m.src_code AND m.code_type='order_status'
WHERE rn = 1; -- 只保留同一单据的最新批次清洗规则用映射表加 SQL 实现,避免散落在多个脚本里的 CASE 分支:新增枚举只要加一行映射数据,不需要回头改所有下游脚本。
判断清洗有没有「洗过头」有一条简单判据:任何被修改的字段都应当能从 ODS 里的原值还原。做不到还原的转换(比如直接丢弃解析失败的行),要么把原值保留到旁路字段,要么把异常行单独落到一张异常表里。