订阅更新

ETL跑完后怎么确保数据是对的?数据质量检查怎么做?

Hive手册 第 12 题 约 4 分钟读完

本文目录
  1. 先说结论
  2. 四个检查维度详解
  3. 实战架构:检查作业作为调度门禁
  4. 总结

先说结论

数据质量检查从四个维度入手:完整性、准确性、一致性、及时性。每个ETL作业后面都应该挂一个质量检查作业,检查通过才触发下游。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

数据质量是数据开发的生命线。你代码写得再好,出来的数据不对,什么都白搭。我在出海硬件公司建了一套数据质量监控体系,埋点数据质量问题减少60%。今天把方法论和实战细节全部讲清楚。

四个检查维度详解

维度一:完整性——数据有没有丢?

核心检查:行数是否符合预期。和昨天、上周同期对比,波动超过20%就告警。

-- 行数波动监控
WITH today AS (
  SELECT COUNT(1) AS cnt FROM dwd_ad_cost WHERE dt='2025-03-15'
), yesterday AS (
  SELECT COUNT(1) AS cnt FROM dwd_ad_cost WHERE dt='2025-03-14'
)
SELECT
  today.cnt AS today_cnt,
  yesterday.cnt AS yesterday_cnt,
  ROUND(ABS(today.cnt - yesterday.cnt) * 100.0 / yesterday.cnt, 1) AS change_pct
FROM today, yesterday
HAVING change_pct > 20;  -- 超20%触发告警

我们还会检查“某个维度的行数是否异常”。比如按渠道统计,如果TikTok渠道的行数突然掉了60%,即使总行数只掉了10%,也应该告警。

维度二:准确性——数据值是否合理?

核心检查:关键字段的NULL率、异常值、取值范围。

-- NULL率检查
SELECT
  COUNT(1) AS total,
  SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS null_cnt,
  ROUND(SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) * 100.0
    / COUNT(1), 2) AS null_pct
FROM dwd_ad_cost WHERE dt='2025-03-15'
HAVING null_pct > 5;  -- NULL超5%告警
 
-- 异常值检查(广告花费不应该为负数)
SELECT COUNT(1) FROM dwd_ad_cost
WHERE dt='2025-03-15' AND cost < 0;

维度三:一致性——跨层数据是否匹配?

核心检查:DWD层和ADS层的核心指标是否一致。

-- 跨层对账:DWD和ADS的总花费是否一致
SELECT
  dwd.total_cost AS dwd_cost,
  ads.total_cost AS ads_cost,
  ABS(dwd.total_cost - ads.total_cost) AS diff
FROM
  (SELECT SUM(cost) AS total_cost FROM dwd_ad_cost
   WHERE dt='2025-03-15') dwd,
  (SELECT SUM(total_cost) AS total_cost FROM ads_channel_report
   WHERE dt='2025-03-15') ads
HAVING diff > 1;  -- 差异>1元告警

维度四:及时性——作业是否按时完成?

检查作业执行时间、数据延迟。比如我们规定ADS层报表必须在早上8点前出数,超时告警。

实战架构:检查作业作为调度门禁

我在出海硬件公司的做法是:每个ETL作业后面挂一个质量检查作业,检查通过才触发下游作业。如果检查失败,下游全部阻断,同时发告警。

这样即使某个ETL出了问题,也不会把错误数据传递到下游报表。业务方看到的最多是“数据还没出”,而不是“数据出错了”——前者的影响远小于后者。

总结

四个维度:完整性、准确性、一致性、及时性。核心架构:质量检查作业作为调度门禁,检查通过才触发下游。面试的时候能说清楚这四个维度和具体SQL,再加上“门禁”架构,非常加分。

下一篇聊一个很多人志题的问题:什么时候需要自己写UDF?能举个真实的例子吗?

你们的数据质量检查是怎么做的?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器