前面的 dbt 核心功能指令有哪些? 要怎麼使用? 提到 dbt test 的基本功能,用於確保 data transformation 的資料正確性和一致性,通常搭配在 dbt run 前後使用
dbt test 是我認爲 dbt 中僅次於 dbt run 的功能,因為就算 dbt 其他功能設計得多方便,你的資料要是不正確,最終也無法使用徒勞無功,所以你需要 dbt test 幫你完成資料產品的品質把關工作
種類
-- Refunds have a negative amount, so the total amount should always be >= 0.
-- Therefore return records where this isn't true to make the test fail
select
order_id,
sum(amount) as total_amount
from {{ ref('fct_payments' )}}
group by 1
having not(total_amount >= 0)
Singular test 如上範例就是寫一個專用的 test query ,若出現結果就是 test fail。這樣寫法優點就是很彈性,想 test 什麼都可以,但缺點是若你的 test 項目很單純, e.g. unique, not null,而且共 10個 model 和 source 會用到,你要寫 10 次這樣的 test query,會很繁瑣且難維護。因此有 Generic tests 的產生
{% test not_null(model, column_name) %}
select *
from {{ model }}
where {{ column_name }} is null
{% endtest %}
generic test 可以讓你只要寫一次 test query,之後彈性的讓 model & column 重複使用
不過 dbt 已經預設的4 個 test,而且周邊也有很多 package 讓你不用自己寫上面的 generic 語法 ,像是官方的 unique
, not_null
, accepted_values
and relationships
4個基本 test,只要如下方 yaml,把 test 名字寫在 tests 下方即可
ps: dbt 各種設定要寫在哪,怎麼寫? 提到設定項目的位置,因為 test 是屬於 properties,自定義 model & column 各種屬性,所以我們建議 test 都寫在 schema.yml 下
version: 2
models:
- name: orders
columns:
- name: order_id
tests:
- unique
- not_null
- dbt_utils.at_least_one
如果這四個 test 還不夠,dbt-utils, dbt-expectation, elementary 的 dbt 周邊 package 也有各種 test 可以使用,安裝好後,如上方紅字一樣加上你想要的 test 就好,更多 package 介紹可以參考下篇
如果以上 package 的 test 都不夠,需要自己寫 generic test,可以參考官方 Writing custom generic tests 內容