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

posted on 2024-06-19 07:14  荣锋亮  阅读(13)  评论(0编辑  收藏  举报

导航