数据质量维度详解:你的数据到底“好不好”

做数据质量,先得搞清楚我们到底在衡量什么。很多人一上来就写代码、跑校验规则,结果查出一堆问题,却不知道怎么分级、怎么推动整改。

我个人习惯,先把六个核心维度记熟。这六条就像体检指标——哪个超标都不好使。

维度一句话定义我关心的核心问题
完整性数据有没有缺胳膊少腿该有的字段、记录、值是不是全的
准确性数据和真实世界一致吗值本身对不对,而不是“有没有”
一致性跨系统跨表能不能对上同一个业务概念,各方口径是否统一
及时性数据更新够不够快从业务发生到数据就绪,延迟在不在容忍范围内
唯一性有没有重复的怪东西每条实体是否只出现一次
有效性数据格式和规则对不对值是否在合法范围内,类型是否合规

我的习惯:每次接到新数据源,先拿这六条快速扫描一遍。大多数烂数据问题,都能在这六个篮子里找到归属。

完整性:数据“缺胳膊少腿”有多严重

完整性,说白了就是该有的不能少。我在项目中遇到过最典型的场景:上游系统的订单表,每天少传几百条记录,结果下游的GMV报表连续三天对不上。

完整性问题分两类:

  • 记录级缺失:少行。比如某渠道的日志丢失了半个小时的数据。
  • 字段级缺失:少列。比如手机号字段有30%的NULL。

你想想看,如果用户表里的邮箱字段全是NULL,那你的营销系统永远发不了邮件。这不仅仅是数据问题,是业务能力直接打折。

检查指标数量级:

记录级看行数波动,字段级看NULL占比。我一般设置阈值:核心字段NULL率>5%就告警。

-- 一个简单的完整性检查SQL
SELECT 
    COUNT(*) AS 总行数,
    COUNT(email) AS 有邮箱的行数,
    (COUNT(*) - COUNT(email)) * 100.0 / COUNT(*) AS 邮箱缺失率
FROM users
WHERE dt = '2024-06-01';

准确性:数据“对”还是“不对”

完整性查“有没有”,准确性查“对不对”。这个维度最容易让人踩坑。

举个例子:用户年龄字段,值都是整数,完整性也没问题。但大量用户年龄“180岁”——数据是完整的,但准确吗?不准确。

我以前对接过一家供应商,他们提供的交易金额字段,NULL率只有0.01%,看着挺漂亮。但我抽检发现,其中约5%的金额写反了正负号。退款记录记成了正向收入。这就是准确性灾难。

准确性检查,我主要靠这几招:

  • 字段级:阈值检查(年龄0-120)、值域检查(金额>=0)
  • 跨表级:汇总对账(SUM求和对比上下游)
  • 样本抽检:随机抽100条人工核对

注意:完整性和准确性经常被混为一谈。记住——完整不等于准确。一个全是“0”的金额字段,很完整,但不准确。

一致性:同一套数据,口径要对齐

一致性,你想想看——同一个“当日活跃用户”,业务系统算出来是100万,数据仓库算出来变成120万,你信谁?

这类问题我见得多了。核心原因就两个:

  1. 口径定义不同:有的按登录算,有的按订单算,口径天然不统一。
  2. 编码标准不同:A系统的“性别-男=1”,B系统的“性别-男=M”,映射不对就出鬼。

我最头疼的一次,是财务和业务两个部门对“净销售额”的定义差了整整一条会计科目。项目组来回扯皮两周,最后是负责人拍板统一了标准。

避坑指南:我习惯在数据接入前,先做一次口径对齐检查。写一个对照表,把各方对同一业务指标的定义、计算逻辑、编码规则列出来。别信文档,信代码和沟通。

-- 一致性检查示例:不同来源的订单状态编码映射
-- 源系统A:0=新建, 1=已支付, 2=已取消
-- 源系统B:N=新建, P=已支付, C=已取消

SELECT 
    a.order_id,
    CASE 
        WHEN a.status = '0' AND b.status = 'N' THEN '一致'
        WHEN a.status = '1' AND b.status = 'P' THEN '一致'
        WHEN a.status = '2' AND b.status = 'C' THEN '一致'
        ELSE '不一致'
    END AS 状态一致性
FROM orders_a a
JOIN orders_b b ON a.order_id = b.order_id;

及时性:数据“迟到”了没

这个维度很多人会忽略,但业务方最敏感。实时报表跑不出来,运营找上门,你就知道什么叫“数据时效性灾难”。

及时性我分两个层次看:

  • 近实时场景:秒级~分钟级延迟。比如交易风控、实时大屏。延迟超过30秒就算事故。
  • 离线场景:T+1或T+2延迟。比如昨日的报表今天中午还没出,业务就会不爽。

我之前负责过一个实时数仓项目,Kafka到Druid的链路延迟一度达到10分钟。查了一圈,是数据源端批量刷数据,没按流式走。我跟他们磨了三天才改成逐条投递。

-- 检查数据延迟的日志示例
-- 一般我们会记录 data_produce_time 和 data_receive_time
-- 然后计算时间差(单位:秒)

日志行示例:
2024-06-01 14:23:00 [INFO] 表ods_order延迟检查: 最大延迟=452秒, 阈值=300秒, 状态=告警

时效性阈值参考:

实时场景:<30秒为绿灯,30-120秒黄灯,>120秒红灯

离线场景:<1小时绿灯,1-4小时黄灯,>4小时红灯(以调度计划为准)

唯一性:别让数据“重复”了

唯一性,说白了就是一条记录只能有一条。重复数据不仅浪费存储,更致命的是造成结果失真。

我见过最离谱的案子:用户画像系统里,同一个人出现了7次。因为ETL按不同时间戳入库,去重逻辑写漏了。最后推荐系统给这个用户发了7封一模一样的优惠券——被投诉了。

唯一性检查,我主要关注:

  1. 主键唯一性:表的主键有没有重复?这个必须100%过。
  2. 业务唯一性:比如一个订单号只能有一条核心记录,但关联记录可以有多条。
-- 唯一性检查SQL
SELECT 
    order_id,
    COUNT(*) AS 重复次数
FROM orders
WHERE dt = '2024-06-01'
GROUP BY order_id
HAVING COUNT(*) > 1;

我曾经犯过一个错:只检查了单表唯一性,没关注跨表唯一性。结果不同表的user_id完全一致,但业务含义不同——那是两个不同系统的用户ID恰好撞了号码。所以,唯一性要结合业务含义来理解。

有效性:数据“格式”合规吗

最后一个是有效性,有人也叫“合规性”。它检查的是数据是否符合预先定义的规则。

常见的有效性规则:

  • 枚举值必须在合法列表内(比如性别只能是男、女、未知)
  • 日期格式必须符合YYYY-MM-DD
  • 数值不能为负数(业务不允许的情况下)
  • 邮箱必须包含@符号

嗯,有效性跟准确性有点重叠,但侧重点不同。准确性关心“值对不对”,有效性关心“格式和规则对不对”。

我记得有个客户,他们的手机号字段,存进去的数据大部分格式都正确,但有大约2%的记录格式乱七八糟——有的带空格,有的加了“+86”前缀没标准化。这就是典型的有效性问题。

-- 有效性检查正则示例
-- 检查邮箱字段是否合法

SELECT 
    email,
    CASE 
        WHEN email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' 
        THEN '有效' 
        ELSE '无效' 
    END AS 有效性状态
FROM users
WHERE dt = '2024-06-01';

一个小技巧:有效性规则最好写成配置文件,而不是硬编码到代码里。这样业务规则变了,改一下配置就好,不用改代码重新部署。

六维全景图:它们之间怎么配合作战

六条维度不是孤立的。比如:一条数据完整性检查通过,但有效性检查不通过;或者准确性通过,但及时性不达标。所以做数据质量,得先分维度,再定优先级。

下面这张图展示了我常用的维度分层逻辑:

数据质量六维全景图 数据质量六维全景 输入层 完整性 记录/字段不缺失 准确性 值与真实世界一致 有效性 格式/规则合规 存储层 一致性 跨系统/表口径对齐 唯一性 无重复记录 应用层 及时性 数据延迟在容忍阈值内 三层递进:输入层保证基础质量 → 存储层保证逻辑正确 → 应用层保证可用性

我习惯按这个顺序排查问题:先看完整性,再看准确性和有效性,接着查一致性和唯一性,最后关注及时性。这样可以快速定位“数据到底烂在哪一层”。

一句话总结:六个维度,六个体检项目。每个维度都有自己的检查方法和指标。别想着一口吃成胖子,先从完整性做起,再到准确性和有效性,最后补上一致性、唯一性和及时性。一步一个脚印,你的数据质量就能稳得住。