ETL跑完后怎么确保数据是对的?数据质量检查怎么做?
先说结论
数据质量检查从四个维度入手:完整性、准确性、一致性、及时性。每个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年大数据老兵,聊技术、聊职场、聊成长