首页/数据/NoSQL 速查/数据质量巡检:完整性、时效与分布
选型与架构50 条

数据质量巡检:完整性、时效与分布

数据接入后要持续巡检四类问题:量级异常(突增突降)、时效劣化(最新数据时间落后)、字段质量(空值率、非法值)、分布漂移(枚举与分位数变化)。把检查写成可调度查询,结果落表并接告警。

NoSQL 速查数据更新于 2026-10-13

是什么

数据质量巡检是把「数据是否可用」变成可调度、可告警的查询:每批数据落地后自动检查量级、时效、字段质量与分布是否符合预期,结果落表并接入告警。它解决的典型问题是「任务成功但数据是坏的」——写入链路没报错,接口返回 200,然而某个上游字段全空、某个分区少了九成数据。

基本信息

检查维度完整性(量级、空值、主键重复)、时效(最新数据时间)、合法性(枚举与类型)、分布(分位数与取值比例)
执行位置数据落地后的下游任务里,与 ETL 同调度;巡检本身也写结果表
判定方式优先用同时段历史基线,固定阈值作为兜底
输出检查项、期望值、实际值、是否通过,落表后可做趋势图

典型使用场景

  • 上游中断的早发现:写入量相对同时段基线骤降,比等到用户投诉快很多
  • 字段质量劣化:某个必填字段空值率从 0.1% 涨到 30%,通常是上游改版或解析规则失配
  • 时效劣化:最新数据时间长期停留在几小时前,说明采集或调度已经卡住
  • 分布漂移:某个枚举值占比突变、金额分位数整体上移,往往对应业务规则或埋点变更
  • 回填校验:补数后检查是否与线上数据重叠、是否出现主键重复
  • 发布前后对照:版本上线后关键指标是否出现台阶式变化

巡检查询示例(ClickHouse)

巡检查询示例(ClickHouse)
-- 量级与时效:近一小时行数与最新数据时间
SELECT count() AS rows_1h, max(ts) AS latest,
       dateDiff('second', max(ts), now()) AS lag_seconds
FROM logs.events
WHERE ts >= now() - INTERVAL 1 HOUR;

-- 字段质量:空值率与非法值占比
SELECT countIf(user_id = '' OR user_id IS NULL) / count() AS null_ratio,
       countIf(status NOT IN ('paid','refunded')) / count() AS invalid_ratio
FROM logs.events
WHERE ts >= now() - INTERVAL 1 DAY;

-- 唯一性:按主键统计重复
SELECT count() AS total, uniqExact(order_id) AS uniq FROM dwd.orders WHERE dt = yesterday();

与历史基线对比(伪代码)

与历史基线对比(伪代码)
# 同时段历史分位数做基线,比固定阈值更能适应周期与趋势
today = run_check("rows_1h")
baseline = median(same_hour_last_14_days("rows_1h"))
if today < baseline * 0.5 or today > baseline * 2:
    alert("量级偏离基线", today=today, baseline=baseline)
    # 记录本次实际值,作为下次基线的样本

检查项与阈值建议

检查项计算方式典型阈值
量级近一小时或近一日行数与历史同时段比低于基线 50% 或高于 200% 告警
时效now 与最大时间戳之差超过采集周期的两到三倍告警
空值率空值或 NULL 计数除以总行数必填字段超过 1% 立即告警
重复率总行数与去重主键数之比大于 1.001 即需排查
分布关键枚举占比、分位数与历史对比占比偏移超过 20% 关注
基线比固定阈值更稳:流量有周期也有趋势,写死的「低于 N 条告警」不是频繁误报就是形同虚设。用同时段历史分位数做基线,并在促销、发版等已知变更期间暂停或放宽判定。
巡检任务自身也会失败或被跳过:要监控巡检结果表的写入时间,否则「没有告警」和「巡检没跑」看起来一模一样,故障会被静默掩盖。

易错点

  • 只监控向上偏离(数据太多),漏掉采集中断导致的写入归零,而后者才是更常见的故障形态
  • 基线在业务大促或版本发布期间未暂停,周期性变更会污染基线并造成持续误报,最后所有人都忽略告警
  • 只检查总量不检查分布:总量正常但某个分区的数据被整体替换,这类问题只有分维度巡检才能发现
  • 巡检跑在数据落地的上游(如直接扫源库),源库抖动会同时影响数据与巡检结果,判定不可信

数据来源与参考

  • ClickHouse Docs: system.query_log
  • InfluxData Docs: Check tasks(概念参考)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌