完整性校验

完整性校验关注缺失:字段空值率、分区是否存在、主体集合是否齐全(例如当日应出现的门店是否都有数据);按业务键比对白名单是实用性较高的完整性问题发现方式。

完整性校验关注什么

完整性校验回答的是「该有的数据是不是都在」:字段级看空值数量与空值率,分区级看应有分区是否存在、是否为空,集合级看应出现的实体(门店、渠道、业务员)是否都出现了。最后这一类最容易被忽略,也最能发现问题——某个地区整体缺失时总行数可能仍属正常波动,只有按主体集合比对才能暴露。

基本信息

字段级关键字段的空值数量与空值率
分区级应有分区是否存在、是否为空
集合级应出现的实体是否都出现(白名单比对)
阈值按历史基线设定可容忍范围

典型使用场景

  • 日切后确认分区已产出:分区不存在直接阻断下游
  • 关键字段空值监控:用户 ID、金额等不允许为空的字段
  • 主体集合比对:当日应上报的门店、渠道是否都出现
  • 上游变更后核对:新增字段是否被正常抽取与落表
  • 交付验收:作为放行条件跑一次完整性检查

分区与空值检查

分区与空值检查
-- 分区是否存在且非空
SELECT COUNT(1) AS rows_cnt FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';

-- 关键字段空值率
SELECT ROUND(SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS null_user_rate
FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';

主体集合完整性

主体集合完整性
-- 应出现的门店未出现即为缺失
SELECT s.store_id
FROM dim_store s
LEFT JOIN (SELECT DISTINCT store_id FROM dwd_store_sales_di WHERE dt='2026-10-11') d
  ON s.store_id = d.store_id
WHERE s.is_active = 1 AND d.store_id IS NULL;

三层完整性检查

层次检查对象漏检的后果
字段级关键字段空值率空值参与计算,指标被稀释或直接报错
分区级分区存在且非空下游读到空数据或任务直接失败
集合级主体白名单覆盖整块业务缺失但总量看不出来
空值率要区分「业务允许为空」和「不该为空」:前者设可容忍阈值,后者应当接近 0 才算通过,两类混用会让告警要么无用要么天天误报。
只检查总行数不看主体集合,某地区或某渠道整体缺失时总行数可能只是略降,波动规则抓不住,这类缺失往往要等业务方投诉才被发现。

易错点

  • 空值率告警阈值设得过松,问题长期存在却无人处理
  • 只检查总行数不检查主体集合,某个地区整体缺失发现不了
  • 把「业务允许为空」的字段也设成零容忍,告警天天响最终被忽略
  • 分区存在性检查放在下游任务里,上游没产出时下游只能等超时,白白浪费窗口

数据来源与参考

  • DAMA-DMBOK 完整性维度
  • 行业数据质量规则实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌