跳到主要内容

质量规则与检测

问题

如何定义和执行数据质量规则?有哪些工具?

答案

规则分类

类型说明示例
非空检查必填字段不能为 NULLuser_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 ExpectationsPython 生态,规则丰富Python 团队
Soda支持多数据库、SodaCL 语法独立质量平台
自研 SQL最灵活、零依赖小团队
推荐实践
  • 使用 dbt test(已集成 dbt 的团队)
  • 用 Great Expectations(Python 为主的团队)
  • 关键表必须有非空、唯一、范围三项基础检查

常见面试问题

Q1: 质量检测应该放在 ETL 的哪个环节?

答案

  • ETL 前:检查源数据质量(ODS 层)
  • ETL 后:检查产出数据质量(DWD/DWS 层)
  • 上线前:回归测试(新模型上线前全量检测)
  • dbt test 在 dbt run 之后自动触发

Q2: 质量检测不通过怎么处理?

答案

  1. 告警:通知数据负责人
  2. 阻断:严重问题阻止下游任务执行
  3. 降级:用昨天数据替代(保证看板不断)
  4. 修复:定位根因 → 修复 → 重跑

相关链接