完整性校验关注什么
完整性校验回答的是「该有的数据是不是都在」:字段级看空值数量与空值率,分区级看应有分区是否存在、是否为空,集合级看应出现的实体(门店、渠道、业务员)是否都出现了。最后这一类最容易被忽略,也最能发现问题——某个地区整体缺失时总行数可能仍属正常波动,只有按主体集合比对才能暴露。
基本信息
| 字段级 | 关键字段的空值数量与空值率 |
|---|---|
| 分区级 | 应有分区是否存在、是否为空 |
| 集合级 | 应出现的实体是否都出现(白名单比对) |
| 阈值 | 按历史基线设定可容忍范围 |
典型使用场景
- 日切后确认分区已产出:分区不存在直接阻断下游
- 关键字段空值监控:用户 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 才算通过,两类混用会让告警要么无用要么天天误报。
只检查总行数不看主体集合,某地区或某渠道整体缺失时总行数可能只是略降,波动规则抓不住,这类缺失往往要等业务方投诉才被发现。