四步法是什么
数据质量问题定位按固定四步走,避免上手就改数据:① 复现现象,确认出问题的时间范围、表、字段与影响行数;② 缩小范围,按分区和维度下钻到异常集中的业务键;③ 沿血缘回溯变更,查上游任务日志、DDL、调度参数与数据源文件;④ 修复并加校验,回刷受影响区间、补充规则防复发。顺序能颠倒的地方不多——先量化影响面再动手,决定是否需要回刷历史,也决定对外沟通口径。
基本信息
| 第 ①步 | 复现:定位到具体表、字段、时间区间,量化影响行数 |
|---|---|
| 第 ②步 | 缩小:按分区与维度下钻,找到异常集中的业务键或渠道 |
| 第 ③步 | 回溯:核对上游任务日志、代码与 DDL 变更、参数与源文件 |
| 第 ④步 | 修复:回刷受影响区间,补校验规则,记录复盘与责任人 |
| 关键证据 | 分区产出行数、任务运行日志、上下游表的比对结果 |
典型使用场景
- 报表数字异常:业务反馈指标突变,需要确认是数据问题还是口径问题
- 稽核告警触发:空值率或重复率超阈值,需要定位起始分区
- 对账失败:源目标行数或校验和不一致,需要确定差异范围
- 上游变更后回归:源表加字段或改类型,下游出现异常值
- 对外口径答疑:确认问题是否影响已发布的月报与经营看板
第 ②步:按天与业务键下钻
第 ②步:按天与业务键下钻
-- 按天观察异常指标变化,定位起始日期(异常从哪天开始)
SELECT dt, COUNT(1) AS cnt,
SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) AS null_amt,
ROUND(SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS null_rate
FROM dwd_trade_order_detail_di
WHERE dt BETWEEN '2026-10-01' AND '2026-10-11'
GROUP BY dt ORDER BY dt;
-- 再看异常集中在哪些业务维度,判断是全局还是局部问题
SELECT channel, COUNT(1) AS cnt,
SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) AS null_amt
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-09'
GROUP BY channel ORDER BY null_amt DESC;第 ③步:核查变更与上下游
第 ③步:核查变更与上下游
# 查任务日志:关注失败重试、跳过、参数覆盖与运行时长变化
airflow tasks logs daily_orders load_dwd 2026-10-09
# 查该表的血缘上游任务与产出时间,确认是否被上游延迟或空跑影响
airflow tasks states-for-dag-run daily_orders 2026-10-09表象与常见根因
| 表象 | 优先怀疑 | 验证方式 |
|---|---|---|
| 指标突然翻倍 | 上游重跑叠加、粒度被打破 | 按业务唯一键分组计数查重复 |
| 指标整体偏低 | 分区缺失被当 0、关联失败丢行 | 比对分区行数与关联前后行数 |
| 某字段大面积为空 | 上游新增字段未回填、映射失效 | 查空值率起始分区与源表同名字段 |
| 只有部分渠道异常 | 单渠道源文件延迟或格式变化 | 按渠道下钻并核对源文件 |
| 跨天趋势断裂 | 回刷未覆盖区间或调度跳跑 | 比对调度运行记录与产出行数 |
四步法里最容易跳过的是第 ①步。不先量化影响面就直接改数据,很可能把问题区间扩大,也让后续对外说明缺少依据。