数据质量六大维度:从理论到实战

聊数据质量,绕不开这六个维度。完整性、准确性、一致性、及时性、唯一性、有效性。我见过不少团队,一上来就搞复杂的数据质量平台,结果连最基本的维度都没定义清楚。说白了,这六个维度就是数据质量的「体检指标」,每个维度对应一类常见问题。

我个人习惯,在项目启动阶段先拿这六个维度做一次「数据健康度扫描」。你会发现,很多坑其实在源头就能堵住。

2.1 完整性:数据有没有缺胳膊少腿?

完整性检查的是数据有没有缺失。字段为空、记录丢失、文件行数不对,都算。

我在项目中遇到过最典型的场景:业务方说「订单表每天应该有 100 万条」,结果某天只来了 80 万。上游系统挂了,但没报错。完整性监控没做,数据就悄无声息地丢了。

核心检查点:
  • 必填字段是否为空(如订单 ID、用户 ID)
  • 记录数是否在合理区间(环比/同比波动)
  • 文件是否完整到达(行数校验、文件大小校验)

代码层面,我一般这样写完整性校验:

-- 检查订单表必填字段
SELECT 
  COUNT(*) AS total_rows,
  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 amount IS NULL THEN 1 ELSE 0 END) AS null_amount
FROM dwd_order_di
WHERE dt = '2024-01-15';
小技巧: 完整性检查最好在数据加载完成后立即执行。别等到下游报表跑完了才发现缺字段,那时候回滚成本就高了。

2.2 准确性:数据对不对?

完整性只关心「有没有」,准确性关心「对不对」。数据值是否在合理范围内?计算逻辑是否正确?

举个例子:订单金额字段,完整性检查通过——没有空值。但准确性检查发现,某笔订单金额是 -100 元。嗯,这明显不对。还有更隐蔽的:金额字段存的是「分」,但下游按「元」解析,结果所有数据都放大了 100 倍。

我曾经踩过一个坑:实时流里有个金额字段,上游改了单位但没通知我们。等发现时,已经影响了三天的报表。从那以后,我要求所有关键字段必须做「值域校验」。

避坑指南: 准确性校验不能只依赖规则。有些错误是「合法但不合理」的,比如用户年龄 200 岁。建议结合统计分布做异常检测。
校验类型 示例 常见问题
值域校验 金额 > 0 负数、超大数据
格式校验 手机号 11 位 多一位、少一位、含字母
业务逻辑校验 下单时间 < 支付时间 时间倒挂
统计分布校验 均值 ± 3σ 离群点、数据漂移

2.3 一致性:不同系统说的是一回事吗?

一致性,说白了就是「同一个东西,在不同地方得长一样」。用户 ID 在 MySQL 里是整数,在 Hive 里是字符串,在 Redis 里又变成了带前缀的编码——这就算不一致。

流批一体架构下,一致性问题尤其突出。批处理跑出来的汇总数据,和实时流算出来的结果对不上,这是最常见的扯皮场景。

我建议从三个层面做一致性校验:

  • 模式一致性: 字段名、类型、长度是否统一
  • 枚举一致性: 状态码、类型值的定义是否一致
  • 数据一致性: 同一份数据在不同存储中的值是否相同
实战经验: 我习惯在数据接入层做「Schema Registry」,所有上游必须注册自己的数据模型。不一致的 schema 直接拒绝接入。虽然初期有点麻烦,但后期省了无数排查时间。

2.4 及时性:数据来得够快吗?

及时性衡量的是数据从产生到可用之间的延迟。实时场景下,延迟可能是秒级;离线场景下,可能是小时级。关键不是「多快」,而是「是否满足 SLA」。

我记得有一次做实时大屏,要求数据延迟不超过 5 分钟。结果某天 Kafka 消费积压,延迟飙到了 30 分钟。业务方直接炸了——大屏上的数字和实际业务差了半小时,根本没法用。

及时性监控的核心指标:

  • 数据产生时间 vs 到达时间: 端到端延迟
  • 处理时间 vs 事件时间: 流处理中的 watermark 延迟
  • 调度延迟: 离线任务是否按时启动
建议: 及时性告警要分级别。延迟 1 分钟发 info,5 分钟发 warning,10 分钟发 critical。别一上来就 pagerduty 轰炸,容易「狼来了」。

2.5 唯一性:数据有没有重复?

唯一性,就是同一份数据不能出现多次。听起来简单,但实际中重复数据防不胜防。

你想想看:实时流里,上游重发了消息;离线任务失败重跑,数据被重复写入;接口超时后重试,结果两次都成功了。这些都是重复数据的来源。

我处理过最夸张的一次:某张用户表,因为去重逻辑写错了,同一个用户出现了 17 条记录。下游做用户画像时,一个用户被算了 17 次,数据直接废了。

避坑指南: 唯一性校验不能只靠业务主键。建议在数据写入层做「幂等性设计」,比如用唯一索引、分布式锁、或者基于事件 ID 的去重。
-- 检查订单表是否有重复主键
SELECT 
  order_id,
  COUNT(*) AS dup_count
FROM dwd_order_di
WHERE dt = '2024-01-15'
GROUP BY order_id
HAVING COUNT(*) > 1;

2.6 有效性:数据符合业务规则吗?

有效性,是检查数据是否满足业务定义的规则。它比准确性更「业务化」。比如:

  • 用户状态只能是 'active'、'inactive'、'banned' 三种
  • 订单金额必须大于 0 且小于 100 万
  • 邮箱地址必须包含 '@' 符号

有效性和准确性的区别在哪?准确性是「值对不对」,有效性是「值合不合法」。一个合法的值不一定准确,但一个不合法的值肯定有问题。

我在项目中习惯把有效性规则维护在「数据质量规则库」里,用配置化的方式管理。这样业务方也能自己加规则,不用每次都找开发改代码。

规则示例:
{
  "rule_name": "用户状态有效性",
  "field": "user_status",
  "type": "enum",
  "allowed_values": ["active", "inactive", "banned"],
  "action": "reject"
}

六大维度全景图

下面这张图,是我自己梳理的六大维度关系。你可以把它当作数据质量建设的「导航图」。

数据质量六大维度全景图 数据质量 完整性 准确性 一致性 及时性 唯一性 有效性 六大维度关系说明 • 完整性和准确性是基础,先保证数据不缺、不错 • 一致性和唯一性解决多系统、多副本的冲突问题 • 及时性和有效性是业务视角的保障,满足 SLA 和规则

这六个维度不是孤立的。举个例子:数据重复(唯一性问题)可能导致汇总值偏高(准确性问题),进而影响跨系统对账(一致性问题)。所以做数据质量,不能只盯着一个维度看。

我个人习惯,在项目初期先定义好每个维度的「质量门禁」——哪些规则是硬性的,不通过就阻断;哪些是软性的,只告警不阻断。这样既能保证数据质量,又不会因为过度校验拖慢开发进度。

最后说一句: 数据质量不是一锤子买卖。这六个维度需要持续监控、持续优化。别指望一次上线就一劳永逸,数据在变,业务在变,质量规则也得跟着变。