空值检测是什么
空值检测按字段批量统计 NULL 行数与空值率,把结果按天写入稽核表,用于趋势对比与阈值告警。它属于数据质量中的完整性维度:主键、金额、时间这类关键字段应接近零空值,业务上确实可空的字段则设上限。检测本身只是一条 SQL,真正的价值在于把「哪个字段允许为空」写进数据字典,规则才可被判对错。
基本信息
| 检测对象 | 主键、外键、金额、时间、状态等关键字段 |
|---|---|
| 输出 | 总行数、各字段空值行数、空值率、检测时间 |
| 阈值 | 关键字段 0 容忍;可空字段设比例上限并按天波动判断 |
| 落库 | 写入稽核结果表,供看板展示与趋势对比 |
| 判定口径 | 以数据字典中「是否允许为空」为唯一标准 |
典型使用场景
- 上线前验收:新表接入时核对关键字段是否有大规模空值
- 日常稽核:每日对核心表执行,形成空值率趋势基线
- 上游关联失败排查:维表关联不上时先看关联键空值率是否突增
- 口径治理:把长期为空的字段标记为废弃或补齐来源
- 变更回归:上游加字段或改类型后,复跑同一套检测确认无回归
多字段空值检测
多字段空值检测
-- 一次扫描输出多个字段的空值情况,避免多次全表扫描
SELECT COUNT(1) AS total_cnt,
SUM(CASE WHEN order_id IS NULL THEN 1 ELSE 0 END) AS null_order_id,
SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS null_user_id,
SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) AS null_pay_amount,
ROUND(SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS null_pay_rate
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-11';
-- 空字符串与 NULL 是两回事,业务上等价时需一并统计
SELECT SUM(CASE WHEN TRIM(COALESCE(user_name, '')) = '' THEN 1 ELSE 0 END) AS blank_user_name
FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';写入稽核表并比对趋势
写入稽核表并比对趋势
-- 每日检测结果落表,保留历史用于趋势与突增判断
INSERT OVERWRITE TABLE dq_check_result PARTITION (dt = '2026-10-11')
SELECT 'dwd_trade_order_detail_di' AS table_name,
'null_pay_rate' AS rule_name,
ROUND(SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS rule_value,
CURRENT_TIMESTAMP AS check_time
FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';
-- 与近 7 天均值对比,涨幅超过阈值即告警
SELECT dt, rule_value
FROM dq_check_result
WHERE rule_name = 'null_pay_rate' AND dt >= DATE_SUB(CURRENT_DATE, 7)
ORDER BY dt;阈值设定参考
| 字段类型 | 期望空值率 | 超阈值处理 |
|---|---|---|
| 主键、明细序号 | 0 | 立即阻断下游并回溯上游写入 |
| 关联键(外键、商品号) | 0 或接近 0 | 先修复映射再放行,否则关联后指标失真 |
| 金额、数量 | 0 | 按业务确认是否可用 0 替代,禁止静默填充 |
| 时间字段 | 0 | 缺失时间的记录无法参与时效与口径计算 |
| 业务可空字段(备注等) | 设上限,如 30% | 观察趋势,突增时报警不阻断 |
COUNT(字段) 会自动跳过 NULL,用它统计总数再相减容易得出「没有空值」的错误结论;判断是否存在空值请用 COUNT(1) - COUNT(字段) 或 SUM(CASE ...)。