跳到主要内容

质量维度详解

问题

数据质量的六大维度分别如何检测?

答案

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: 六个维度中哪个最重要?

答案

  • 取决于业务场景
  • 金融/支付:准确性最重要
  • 实时监控:及时性最重要
  • 用户分析:完整性和唯一性最重要
  • 通常建议:准确性 > 完整性 > 一致性 > 及时性 > 唯一性 > 有效性

相关链接