首页/数据/数仓建模速查/DWD 清洗规则清单
分层与规范64 条

DWD 清洗规则清单

常见清洗动作:主键去重(保留最新批次)、字符串去空格、日期格式统一、枚举标准化、非法值归入未知成员、金额精度对齐;规则集中管理可回放。

数仓建模速查数据更新于 2026-10-13

清洗规则清单是什么

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 里的原值还原。做不到还原的转换(比如直接丢弃解析失败的行),要么把原值保留到旁路字段,要么把异常行单独落到一张异常表里。

易错点

  • 清洗规则只写在脚本注释里:没人能复现,出了问题只能靠猜
  • 解析失败的行直接丢弃:数据静默变少,行数与上游对不上
  • 枚举映射硬编码 CASE WHEN:新增枚举要改多个脚本,容易漏改
  • 去重按错误字段排序:保留的版本不是最新的,下游取到过期状态
  • 在 DWD 覆盖原始值又不留备份:想核对源值时已无从查起

数据来源与参考

  • Kimball《数据仓库工具箱(第3版)》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌