灯是绿的,数字却是错的
一句话总结
管道成功/失败是与数据的正确/错误不同的维度。 如果不检查质量,仪表板会在安静地空着的桌子上变成绿灯。 打开了。
为什么需要这个?
在周一早上的会议上,报告说销售额比上周下降了40%。 营业团队被颠覆了。一整天都在寻找原因,下午才揭开真相—— 上游系统周六没有发送文件,管道是空文件 正常处理后载入了0件。
管道没有失败。没有错误,没有重新尝试,也没有通知。 没有。问题是没有人知道什么都没有发生 是。
四个质量轴
| 轴 | 问题 | 测量 |
|---|---|---|
| 新鲜度 (freshness) | 数据是什么时候 | 最新记录视图和现在的差异 |
| 完整性 (completeness) | 有不至于有 | 数量、占用率 |
| 唯一性 (uniqueness) | 无重复吗 | 按键的重复次数 |
| 有效性 (validity) | 值是否遵守规则 | 范围·格式·参考完整性 |
可以用一行查询各自。
-- 신선도: 마지막 데이터가 몇 분 전인가
SELECT extract(epoch from now() - max(event_at))/60 AS lag_min FROM events;
-- 완전성: 어제 건수가 지난 7일 평균 대비 얼마인가
WITH d AS (
SELECT date_trunc('day', event_at) AS day, count(*) AS n
FROM events WHERE event_at >= now() - interval '8 days' GROUP BY 1)
SELECT (SELECT n FROM d ORDER BY day DESC LIMIT 1)::float
/ NULLIF(avg(n), 0) AS ratio FROM d;
-- 유일성
SELECT count(*) FROM (
SELECT order_id FROM orders GROUP BY 1 HAVING count(*) > 1) x;
-- 유효성
SELECT count(*) FROM orders WHERE amount < 0 OR status NOT IN ('NEW','PAID','CANCELLED');
临界值不是绝对值,而是比例。
数量少于1000的通知规则很快就会变得毫无用处。服务 一旦开始,就必须不断调整临界值,但没有人愿意这样做。
相反,与自己进行比较。
- 昨天件数/最近7天同一天平均→低于0.5的话警告
- 你的比例比上周增加了2倍以上
- 新鲜度延迟超过平时p95的3倍
如果忽略工作日效果的话,每个星期一都会收到五点通知。周末流量很少。 在服务中,“与昨天相比”每周一上午发出虚假警报。 请在同一工作日之间进行比较。
数据合同
质量检查是事后应对。根本是与上游达成共识。
数据合同(data contract)是生产者和消费者之间的明确承诺。
dataset: orders
owner: order-team
schema:
order_id: { type: string, required: true, unique: true }
amount: { type: decimal, required: true, min: 0 }
status: { type: enum, values: [NEW, PAID, CANCELLED] }
created_at: { type: timestamp, required: true }
sla:
freshness: 30m # 30분 이내 데이터가 있어야 함
completeness: 0.99 # 널 비율 1% 미만
breaking_change: 30일 전 공지
如果有合同的话,会有两种不同。
- **责任主体变得明确。**不是“结构发生了变化而破裂了” "违反了合同"就可以了。
- **可以进行自动验证。**合同文件本身就是检查规则。
把检查放在哪里?
추출 → [입력 검사] → 변환 → [출력 검사] → 적재 → [사후 검사]
- 输入检查—上游提供的符合合同吗?在这里阻止的话,污染会 不会向下游传播。
- 输出检查 — 我们的转换生成的结果是否正确。数量保持不变,总和一致。
- 事后检查—装载的桌子的新鲜度、完整性。定期帮助。
最常见的错误是只进行事后检查。那样的话,已经被污染的数据 通过仪表板和其他管道传播后才知道。
要如何处理失败呢?
检查失败时,选择项有三个。
| 应对 | 什么时候 |
|---|---|
| 中断 (fail) | 下游写错数据时。结算·结算 |
| 隔离 (quarantine) | 只有部分有问题时。只排除不良行为,其余继续进行。 |
| 警告 (warn) | 即使质量低也不如没有的好时候。 用于导航的数据 |
不能无条件中断——如果因为小事导致整个系统停止,人们就会停止检查。 把它关掉。绝对不能警告——没有人看。每个数据集 必须确定。
在现场相遇的样子
- 上游没有发送文件,但写了0件合格,“成功”→缺少新鲜度·完整性检查。
- 当结构体中添加热量时,解析会被推迟,导致值错位一个格 → 缺少输入检查。
- 重新处理后数量翻倍→缺乏唯一性检查。
将在下面的测验中确认
通过查询实现四个质量指标,应用于实际数据集,考虑了工作日。 用相对临界值检测异常。是否会造成违反合同而被检查发现 确认后,区分并应用中断、隔离、警告这三种应对措施。