质量规则与检测
问题
如何定义和执行数据质量规则?有哪些工具?
答案
规则分类
| 类型 | 说明 | 示例 |
|---|---|---|
| 非空检查 | 必填字段不能为 NULL | user_id IS NOT NULL |
| 唯一检查 | 主键不能重复 | COUNT(DISTINCT pk) = COUNT(*) |
| 范围检查 | 值在合理范围内 | age BETWEEN 0 AND 150 |
| 引用完整性 | 外键存在于维度表 | order.user_id IN dim.users |
| 行数波动 | 数据量在正常范围 | 今日行数 / 昨日行数 BETWEEN 0.7 AND 1.3 |
| 聚合校验 | 上下游数据一致 | SUM(ods.amount) = SUM(dwd.amount) |
dbt test 示例
# schema.yml - dbt 内置测试
models:
- name: dwd_orders
columns:
- name: order_id
tests:
- not_null # 非空
- unique # 唯一
- name: user_id
tests:
- not_null
- relationships: # 引用完整性
to: ref('dim_users')
field: user_id
- name: pay_amount
tests:
- not_null
- dbt_utils.accepted_range: # 范围
min_value: 0
max_value: 1000000
工具对比
| 工具 | 特点 | 适用 |
|---|---|---|
| dbt test | 与 dbt 深度集成,SQL 定义 | dbt 用户 |
| Great Expectations | Python 生态,规则丰富 | Python 团队 |
| Soda | 支持多数据库、SodaCL 语法 | 独立质量平台 |
| 自研 SQL | 最灵活、零依赖 | 小团队 |
推荐实践
- 使用 dbt test(已集成 dbt 的团队)
- 用 Great Expectations(Python 为主的团队)
- 关键表必须有非空、唯一、范围三项基础检查
常见面试问题
Q1: 质量检测应该放在 ETL 的哪个环节?
答案:
- ETL 前:检查源数据质量(ODS 层)
- ETL 后:检查产出数据质量(DWD/DWS 层)
- 上线前:回归测试(新模型上线前全量检测)
- dbt test 在
dbt run之后自动触发
Q2: 质量检测不通过怎么处理?
答案:
- 告警:通知数据负责人
- 阻断:严重问题阻止下游任务执行
- 降级:用昨天数据替代(保证看板不断)
- 修复:定位根因 → 修复 → 重跑