2、质量监控体系概述:数据质量六大维度与监控架构设计
聊数据质量,绕不开那六个老生常谈的维度。但说实话,我刚入行那会儿,觉得这六个词就是PPT上的装饰品。直到有一次,我负责的客户数据平台上线第二天,业务方就炸了——同一批客户,在CRM系统里叫“张三”,在订单系统里叫“张先生”,在营销系统里直接丢了手机号。嗯,那天我才真正明白,数据质量不是理论,是命根子。
这一节,我就把这六个维度的实战用法掰开揉碎讲清楚,再给你看一套我亲手搭过的监控架构长什么样。
2.1 数据质量六大维度
先给个总览表,方便你快速对照。后面每个维度我都会加点个人踩坑经验。
| 维度 | 定义 | 典型问题 | 我常用的检查手段 |
|---|---|---|---|
| 完整性 | 数据是否缺失、空值比例是否超标 | 必填字段为空、记录数少于预期 | 空值率统计 + 记录数波动检测 |
| 准确性 | 数据是否真实反映客观事实 | 金额算错、日期格式错误、数值越界 | 字段级规则校验 + 交叉比对源系统 |
| 一致性 | 同一实体在不同系统中的数据是否对齐 | 用户ID不匹配、状态码定义不同 | 跨系统关键字段哈希比对 |
| 及时性 | 数据从产生到可用的延迟是否在SLA内 | T+1报表延迟到T+3、实时流断连 | 时间戳监控 + 数据新鲜度打点 |
| 唯一性 | 数据是否存在重复、主键是否唯一 | 重复订单、重复用户注册 | 主键去重计数 + 业务唯一键校验 |
| 有效性 | 数据是否符合业务规则或格式规范 | 手机号位数不对、邮箱缺少@、枚举值越界 | 正则表达式 + 枚举值白名单 |
2.1.1 完整性
完整性,说白了就是“该有的数据有没有”。我见过最离谱的案例:某电商大促后,订单表的“收货地址”字段空值率飙到40%,结果是因为前端改版时漏传了这个字段。数据管道照跑不误,但物流部门直接瘫痪。
我个人习惯,完整性监控分两层:
- 行级完整性:检查记录数是否在合理区间。比如每天凌晨3点跑批,如果今天订单表只有昨天的一半,立刻报警。
- 列级完整性:对每个关键字段设定空值率阈值。比如“手机号”字段空值率不能超过5%,超过就触发告警。
2.1.2 准确性
准确性是数据质量的“硬通货”。数据不准,分析再漂亮也是垃圾。我曾经在一个金融项目中遇到过:交易金额字段在ETL过程中被错误地除以了100,导致所有报表的金额都少了两位小数。这个bug潜伏了整整两周才被发现,因为没人想到去核对原始流水。
准确性检查,我一般用三种方法:
- 字段级规则校验:比如“年龄”字段必须在0-120之间,“交易金额”必须大于0。
- 跨系统交叉比对:从源系统抽一条样本,跟目标系统的数据逐字段比对。这个不能全量做,但抽样必须常态化。
- 统计分布异常检测:比如某个字段的均值突然偏离了历史基线,即使没有违反规则,也值得怀疑。
2.1.3 一致性
一致性,是数据治理里最让人头疼的维度。为什么?因为数据在多个系统间流转,每个系统都有自己的“方言”。
举个例子:用户状态,CRM系统里用“1-活跃、2-沉默、3-流失”,但营销系统里用“A-正常、B-需唤醒、C-已流失”。两套数据一合并,直接乱套。
我建议的做法是:
- 在数据仓库层建立统一的编码映射表,所有系统接入时强制转换。
- 定期跑一致性校验任务,对比关键实体(如用户、订单)在不同系统中的记录数、关键字段值是否一致。
2.1.4 及时性
及时性,就是数据“快不快”。业务方对数据延迟的容忍度越来越低。实时报表要求秒级,离线报表也要求T+1早上8点前必须产出。
我常用的及时性监控指标:
- 数据新鲜度:当前表中最新数据的时间戳与当前时间的差值。
- 任务完成时间:ETL任务的实际结束时间是否晚于SLA约定的时间。
- 数据到达率:比如实时流中,每5分钟应该到达1000条数据,如果连续3个窗口都低于800条,说明管道可能堵塞了。
2.1.5 唯一性
唯一性,核心就是“有没有重复”。听起来简单,但实际场景里坑很多。比如用户注册时,同一个身份证号被两个账号绑定,或者同一个订单在数据库中出现了两条记录。
我一般这样处理:
- 对每个表的主键做去重计数,如果去重后的记录数小于总记录数,说明有重复。
- 对业务唯一键(比如订单号、身份证号)也做同样的检查。
- 如果发现重复,需要回溯到源头,看是应用层没做防重,还是ETL过程中产生了重复数据。
2.1.6 有效性
有效性,检查的是数据“格式对不对、值合不合法”。这个维度跟准确性有点像,但更偏格式层面。
举个例子:手机号字段,有效性检查会看是不是11位数字、是不是以1开头。准确性检查则会进一步看这个手机号是不是真实存在的。
我常用的有效性规则:
- 正则表达式:邮箱、手机号、身份证号等。
- 枚举值白名单:比如“性别”字段只能取“男”、“女”、“未知”。
- 长度校验:比如“姓名”字段不能超过50个字符。
2.2 监控体系架构设计
六个维度讲完了,但光有维度没有架构,等于有枪没子弹。下面这张图是我在一个中型数据平台里实际落地的监控架构,你可以参考一下。
这个架构我分了五层,每一层都有明确的职责:
- 数据源层:不管数据从哪来,先统一接入。我见过很多团队在这一层就乱了,每个源单独写采集脚本,最后监控根本没法统一管理。
- 采集与存储层:数据进来后,先落地到统一的存储层。这里要注意,质量监控的数据和业务数据最好分开存储,避免互相影响。
- 质量监控引擎:这是核心。六个维度的检查规则都在这里配置和运行。我习惯把规则做成可配置的,业务方可以自己调整阈值,不用每次都找数据团队改代码。
- 告警与通知层:发现问题后,怎么通知人?我的经验是:分级告警。P0级问题(比如核心表数据全丢)直接电话+短信,P3级问题(比如某个非关键字段空值率偏高)发个邮件就行。
- 可视化与治理层:最后,所有质量数据要能看得见。我做过一个质量看板,每天自动生成数据质量报告,业务方和运维都能看到自己关心的指标。
2.3 规则配置示例
光说理论太虚,我贴一段实际项目中用过的规则配置代码。这是用YAML写的,可读性高,也方便版本管理。
# 数据质量规则配置示例
rules:
- rule_id: "R001"
dimension: "完整性"
table: "ods_order"
field: "order_id"
check_type: "not_null"
threshold: 0.99 # 非空率必须 ≥ 99%
severity: "P0"
action: "phone_call"
- rule_id: "R002"
dimension: "准确性"
table: "dwd_user"
field: "age"
check_type: "range"
min: 0
max: 120
severity: "P2"
action: "email"
- rule_id: "R003"
dimension: "一致性"
table: "ads_user_summary"
check_type: "cross_system_compare"
source_system: "crm"
target_system: "marketing"
key_field: "user_id"
compare_fields: ["status", "level"]
severity: "P1"
action: "dingtalk_robot"
- rule_id: "R004"
dimension: "及时性"
table: "dws_daily_sales"
check_type: "data_freshness"
max_delay_minutes: 30 # 数据延迟不能超过30分钟
severity: "P1"
action: "sms"
- rule_id: "R005"
dimension: "唯一性"
table: "ods_user"
field: "user_id"
check_type: "unique"
severity: "P0"
action: "phone_call"
- rule_id: "R006"
dimension: "有效性"
table: "ods_user"
field: "phone"
check_type: "regex"
pattern: "^1[3-9]\\d{9}$"
severity: "P2"
action: "email"
你看,每条规则都绑定了维度、检查类型、阈值、严重等级和告警方式。这样配置的好处是:规则和代码解耦,业务方改阈值不用找开发,自己改YAML文件就行。