首页/数据/数据工程与 ETL 速查/Spark 聚合式质量校验

Spark 聚合式质量校验

不引入额外框架时,用一个 Spark SQL 聚合作业即可一次扫描产出多项质量指标:行数、空值数、负值数、重复数;结果写入稽核表并按天与基线对比,比单一绝对阈值更早发现异常。

Spark 聚合式质量校验

不引入额外框架时,用一个 Spark SQL 聚合作业就能一次扫描产出多项质量指标:总行数、主键空值数、负值数、重复数、以及关键字段的均值与最大最小值。结果写入稽核表后,按天与基线对比(同比或分位数区间),比单一绝对阈值更早发现异常。这种做法的优点是零依赖、易接入现有调度;缺点是规则写在 SQL 里,增减规则要改代码重新发布,规则规模大时建议升级到配置化方案。

基本信息

实现方式一条 Spark SQL 聚合作业一次扫描产出多指标
产出指标行数、空值数、负值数、重复数、均值与分位数
结果去向写入稽核表,供看板与环比基线对比
调度位置产出任务之后,作为该表的质量关卡
扩展方向规则增多后迁移到配置化规则引擎

典型使用场景

  • ODS 入仓后立刻校验源端数据是否完整(行数与空值)
  • DWD 产出后校验主键唯一与金额非负
  • 数据量小的表直接全量校验,避免抽样遗漏长尾错误
  • 结果写入稽核表后接看板,值班按表查看当天是否通过
  • 临时排查:怀疑某表有问题时手工跑一次聚合作业

一次扫描算多指标

一次扫描算多指标
SELECT
  COUNT(*)                                        AS cnt,        -- 总行数
  SUM(CASE WHEN order_id IS NULL THEN 1 ELSE 0 END) AS null_pk,  -- 主键空值
  SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END)       AS neg_amount, -- 负金额
  COUNT(*) - COUNT(DISTINCT order_id)             AS dup_pk,     -- 重复主键(近似)
  ROUND(AVG(amount), 2)                           AS avg_amount, -- 均值
  MAX(amount)                                     AS max_amount
FROM ods_orders
WHERE dt = '2026-10-11';

-- 说明一:先做分区裁剪,避免全表扫描
-- 说明二:COUNT(DISTINCT) 在大表上开销较高,可用 group by 聚合替代
-- 说明三:结果写入稽核表后与基线对比,不要只看单值

指标与判据

指标正常值异常含义处置建议
cnt 总行数与基线同量级骤降或翻倍先查上游产出与过滤条件
null_pk0主键缺失阻断下游并回溯上游
neg_amount0出现负金额确认是否为退款场景
dup_pk0主键重复按粒度声明核对并修复
avg_amount在基线区间内均值明显偏移结合业务日历判断
COUNT(DISTINCT) 在大表上开销较高:先做分区裁剪,必要时改为 group by 后再聚合统计,避免校验本身成为瓶颈。
校验 SQL 与业务口径不一致(把测试单、冲正单算进去)时,指标天然偏差,稽核结果会被业务方质疑,规则很快失去权威性。
指标要留存历史:没有历史值时无法判断今天是真异常还是正常波动,第一天告警往往就没人信。

易错点

  • 校验 SQL 与业务口径不一致(把测试单、冲正单算进去),指标天然偏差
  • 指标没有历史留存,无法判断真异常还是正常波动,告警很快被忽略
  • 校验任务未做分区裁剪,全表扫描挤占产出窗口,反而影响数据及时性
  • 只校验行数不校验主键与金额,行数正常但内容错误的情况完全漏掉

数据来源与参考

  • Apache Spark 官方文档(SQL 聚合函数)
  • 行业数据质量稽核实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌