首页/数据/数据工程与 ETL 速查/数据质量问题定位四步法

数据质量问题定位四步法

定位流程:① 复现现象(确认时间范围与影响面)② 缩小范围(按分区、维度、单条键下钻)③ 沿血缘找变更(上游任务、DDL、参数、数据源)④ 修复并加校验防复发。

四步法是什么

数据质量问题定位按固定四步走,避免上手就改数据:① 复现现象,确认出问题的时间范围、表、字段与影响行数;② 缩小范围,按分区和维度下钻到异常集中的业务键;③ 沿血缘回溯变更,查上游任务日志、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、关联失败丢行比对分区行数与关联前后行数
某字段大面积为空上游新增字段未回填、映射失效查空值率起始分区与源表同名字段
只有部分渠道异常单渠道源文件延迟或格式变化按渠道下钻并核对源文件
跨天趋势断裂回刷未覆盖区间或调度跳跑比对调度运行记录与产出行数
四步法里最容易跳过的是第 ①步。不先量化影响面就直接改数据,很可能把问题区间扩大,也让后续对外说明缺少依据。

易错点

  • 不确认影响范围就重跑全量,把问题区间从一天扩大成一个月
  • 只修数据不改上游(或未加校验),次日同一问题原样复现
  • 按现象直接猜结论,跳过血缘回溯,改对了现象但根因仍在
  • 修复过程没有留痕(谁在什么时候回刷了哪些分区),复盘无法还原现场
  • 把口径问题当数据问题排查,投入大量工时后发现是报表逻辑变更

数据来源与参考

  • 行业数据质量故障排查实践
  • Apache Airflow 官方文档(任务日志排查)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌