dbt 编写自定义通用测试
以前简单介绍或dbt 的数据测试(包含了通用测试以及异常测试),通用测试可复用性比较高,是比较推荐的选择
而且通用测试的扩展能力也是比较强大的,可以直接引用模型,自定义配置
一个参考使用
version: 2
models:
- name: orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'returned']
- name: customer_id
tests:
- relationships:
to: ref('customers') # 通过ref 引用模型
field: id
参考自定义
一般通用测试需要包含model需要测试的模型以及column_name需要test的列,如果需要扩展新的,直接添加后边就行了
- 参考定义
{% test relationships(model, column_name, field, to) %}
with parent as (
select
{{ field }} as id
from {{ to }}
),
child as (
select
{{ column_name }} as id
from {{ model }}
)
select *
from child
where id is not null
and id not in (select id from parent)
{% endtest %}
- 参考使用
version: 2
models:
- name: people
columns:
- name: account_id
tests:
- relationships:
to: ref('accounts') # 通过ref 引用模型
field: id
一个其他玩法
比如dq-tools 这个工具就使用了jinja2 kwargs 的特性获取一些其他参数
- 参考使用
{% test accepted_values_where_db(model, values) %}
{% set column_name = kwargs.get('column_name', kwargs.get('arg')) %}
{% set where = kwargs.get('where', kwargs.get('arg')) %}
{% set severity_level = kwargs.get('severity_level', 'warn') %}
{% set kpi_category = kwargs.get('kpi_category', 'Accuracy') %}
{% set p_invocation_id = invocation_id %}
{% set model_text = model | replace("'", "''") %}
- config 使用
通用test 中可以包含自己的config
{% test warn_if_odd(model, column_name) %}
{{ config(severity = 'warn') }}
select *
from {{ model }}
where ({{ column_name }} % 2) = 1
{% endtest %}
说明
dbt 的test 目前来说扩展性还是很不错的,不少基于dbt 的数据质量框架都会基于此进行扩展,使用起来也是很方便的
参考资料
macros/generic_tests/test_recency_db.sql
https://docs.getdbt.com/docs/build/data-tests
https://docs.getdbt.com/reference/data-test-configs
https://docs.getdbt.com/reference/resource-properties/data-tests
https://docs.getdbt.com/best-practices/writing-custom-generic-tests