质量维度详解
问题
数据质量的六大维度分别如何检测?
答案
1. 准确性(Accuracy)
数据值是否真实、正确。
-- 检测异常值
SELECT COUNT(*) AS invalid_cnt
FROM dwd.orders
WHERE pay_amount < 0 -- 金额不能为负
OR pay_amount > 1000000 -- 金额异常大
OR order_date > CURRENT_DATE; -- 日期在未来
2. 完整性(Completeness)
必填字段是否有缺失。
-- 检测空值率
SELECT
COUNT(*) AS total,
SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) AS null_user_id,
SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) AS null_amount,
ROUND(SUM(CASE WHEN user_id IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS null_rate_pct
FROM dwd.orders
WHERE dt = '2024-01-15';
3. 一致性(Consistency)
不同数据源之间的数据是否一致。
-- 上下游数据量对数
SELECT 'source' AS layer, COUNT(*) AS cnt FROM ods.raw_orders WHERE dt = '2024-01-15'
UNION ALL
SELECT 'dwd' AS layer, COUNT(*) AS cnt FROM dwd.orders WHERE dt = '2024-01-15'
UNION ALL
SELECT 'dws' AS layer, SUM(order_cnt) AS cnt FROM dws.daily_stats WHERE dt = '2024-01-15';
4. 及时性(Timeliness)
数据是否按时到达。
| 检测方式 | 说明 |
|---|---|
| 分区检查 | _SUCCESS 标记文件是否存在 |
| 时间戳检查 | 最大 event_time 是否在预期范围 |
| 调度监控 | Airflow 任务是否按时完成 |
5. 唯一性(Uniqueness)
是否存在重复数据。
-- 检测主键重复
SELECT order_id, COUNT(*) AS dup_cnt
FROM dwd.orders
WHERE dt = '2024-01-15'
GROUP BY order_id
HAVING COUNT(*) > 1;
6. 有效性(Validity)
数据格式是否合规。
-- 检测格式异常
SELECT COUNT(*) AS invalid_phone
FROM dim.users
WHERE phone NOT REGEXP '^1[3-9][0-9]{9}$'; -- 非标准手机号
SELECT COUNT(*) AS invalid_email
FROM dim.users
WHERE email NOT LIKE '%@%.%'; -- 非标准邮箱
常见面试问题
Q1: 如何建立日常的数据质量巡检?
答案:
- 每个分区 / 每天自动运行质量检测 SQL
- 用 dbt test 或 Great Expectations 定义规则
- 检测结果写入质量报告表,异常自动告警
Q2: 六个维度中哪个最重要?
答案:
- 取决于业务场景
- 金融/支付:准确性最重要
- 实时监控:及时性最重要
- 用户分析:完整性和唯一性最重要
- 通常建议:准确性 > 完整性 > 一致性 > 及时性 > 唯一性 > 有效性