4、数据质量生命周期:全链路质量管控
数据质量不是某个环节的事。它贯穿数据从出生到消亡的全过程。
我习惯把这六个阶段串起来看——数据产生、采集、传输、存储、处理、消费。任何一个环节出问题,下游都会跟着遭殃。说白了,这就是个“木桶效应”,最短的那块板决定了你的数据质量水平。
4.1 数据产生:源头决定一切
数据质量的第一道关,在数据产生的那一刻就定下了。你想想看,如果源头的数据就是脏的,后面再怎么洗也洗不干净。
我在项目中遇到过最典型的例子——业务系统把手机号字段设计成 varchar(20),结果前端没做校验,用户填了个“12345678901abc”。这条数据进了数仓,下游做用户画像时直接报错。嗯,这就是源头失控的代价。
4.2 数据采集:接口与日志的“第一公里”
采集阶段常见的问题有三个:重复、丢失、精度偏差。
- 重复采集——比如日志采集工具挂了重启,同一批数据被拉了两次。
- 精度丢失——API 接口返回的 decimal(18,6),采集程序只读了 4 位小数。
- 字段截断——源端字段长度 500,采集端只定义了 200,数据被硬生生切掉。
我曾经排查过一个线上事故:交易金额对不上账,查了两天发现是采集时把“分”转“元”的精度丢了。从那以后,我要求所有金额字段必须保留原始精度,转换逻辑统一在消费层做。
4.3 数据传输:网络不是可靠的
很多人觉得数据传输就是“发出去、收回来”,没什么好管的。其实不然。
我见过最离谱的事——Kafka 集群某个 broker 磁盘满了,消息积压了 6 小时,下游实时报表直接变成“历史报表”。
传输阶段要关注三个指标:
| 指标 | 说明 | 常见阈值 |
|---|---|---|
| 延迟 | 从发送到接收的时间差 | 实时场景 < 1s,离线场景 < 30min |
| 丢包率 | 丢失数据包占比 | 应接近 0%,超过 0.1% 需告警 |
| 乱序率 | 数据到达顺序与产生顺序不一致的比例 | 业务容忍度视场景而定 |
4.4 数据存储:分区、编码、元数据
存储阶段的质量问题,往往藏得很深。我举个例子——Hive 表按日期分区,但业务系统的时间字段有时是“2024-01-01”,有时是“2024/01/01”。分区字段格式不统一,查询时直接扫全表。
存储阶段我建议重点检查:
- 分区策略——是否按业务时间正确分区?分区字段类型是否统一?
- 字符编码——全链路统一用 UTF-8,别混用 GBK 和 UTF-8。
- 元数据完整性——字段注释、数据类型、主外键约束是否齐全?
4.5 数据处理:ETL 里的“隐形炸弹”
数据处理是质量问题的重灾区。ETL 脚本里一个 join 条件写错,可能让整张宽表的数据都歪掉。
我记得有一次排查用户活跃度报表,发现某天的数据突然翻了一倍。查到最后,是 ETL 里 left join 写成了 inner join,把非活跃用户也过滤进来了。这种逻辑错误,数据量对不上才暴露出来。
处理阶段要建立“数据漂移监控”:
- 每天跑完 ETL 后,自动对比关键指标(如总行数、SUM 值、去重数)与历史基线。
- 偏差超过 5% 自动告警,人工介入排查。
-- 示例:数据漂移检测 SQL
SELECT
'订单表' as table_name,
COUNT(*) as row_count,
SUM(amount) as total_amount,
COUNT(DISTINCT user_id) as user_cnt
FROM dwd_order_di
WHERE dt = '${yesterday}'
UNION ALL
SELECT
'订单表' as table_name,
COUNT(*) as row_count,
SUM(amount) as total_amount,
COUNT(DISTINCT user_id) as user_cnt
FROM dwd_order_di
WHERE dt = '${day_before}'
4.6 数据消费:最后一公里的质量
数据最终要给人看、给系统用。消费阶段的质量问题,最容易被业务方投诉。
常见问题:
- 口径不一致——两个报表的“活跃用户”定义不同,一个算登录,一个算下单。
- 时效性差——T+1 的数据,业务方下午 3 点还没看到。
- 数据不一致——API 接口返回的数据和数据库对不上。
我建议在消费层做“数据对账”:每天自动比对报表层与明细层的关键指标,不一致就发邮件给数据负责人。
说白了,数据质量生命周期管理不是什么高深理论。它就是让你在每个环节都多问一句:“这数据靠谱吗?” 养成这个习惯,比任何工具都管用。