今天的主題是 tests。
dbt 有很多種 test 的方法,今天只講最基本內建的 generic tests (舊名 schema tests),只要在 yaml 檔即可定義 tests。
昨天暫時進入 Deploy,今天要回到 Develop 的部份。
回到 Cloud IDE 的時候會發現黃色的 Pull from "main"。
按下去就對了,這個是由於系統偵測到 main branch 前兩天有異動,所以我們要按下去,確保 main branch 的異動有併入目前的分支。
在SQL開發流程中,我們有時會寫錯語法,例如 join 錯欄位,資料膨脹兩倍,數字直接全錯。
為了不要出錯,我們必須付出200%的專注力;為了不要出錯,寫完 SQL 要再多檢查2遍;為了不要出錯,最後再花2倍時間比對數字。人生,真難。
dbt tests 可以幫助我們更容易的驗證資料。例如,特定欄位組合不重複。又例如,兩個 table 的數字加總相同。
dbt tests 不僅幫助驗證資料,不再需要把資料抓到 excel 拉來拉去,dbt test 更是我們資料排程的一部分。只要沒通過 test 的 model,就不會再污染下游資料。
首先我們要在 YAML 檔定義 tests。
我們先針對 model: stg_customers 的欄位 customer_id,定義一個 test ,檢查該欄位是否沒有空值或重複。
在 models 底下新增檔案 schema.yml,並加入以下內容:
version: 2
models:
- name: stg_customers
columns:
- name: customer_id
tests:
- unique
- not_null
存檔後在指令列執行 dbt test
,就能自動檢查欄位是否符合 test 的假設:不重複、不為 null。
dbt 內建的 generic tests 總共有四種:
現在我們要來加入更多 tests。
請將以下內容貼到前一步驟新增的 schema.yml 檔。
原始來源:Quickstart for dbt Cloud and BigQuery - Add tests to your models
version: 2
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
- name: stg_customers
columns:
- name: customer_id
tests:
- unique
- not_null
- name: stg_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
- name: customer_id
tests:
- not_null
- relationships:
to: ref('stg_customers')
field: customer_id
由以上例子,我們除了針對一些欄位加入基本的 tests:
也可以定義欄位只允許哪些值
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
再來也可以定義欄位允許的值,必須存在於另外一個 model,類似 foreign key 的概念。
- relationships:
to: ref('stg_customers')
field: customer_id
讓我們來製造一個 test 失敗的情境...
把以下語法中,values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
改成 values: ['placed', 'shipped', 'completed']
,拿掉一些狀態,故意讓檢核失敗。
- name: stg_orders
columns:
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
存檔後再跑一次 dbt test,可以看到該檢核出現紅色的叉叉。
現在要來介紹一個新的指令:dbt build
引用官方文件
The
dbt build
command will:
- run models
- test tests
- snapshot snapshots
- seed seeds
這個指令可以結合 dbt run
和 dbt test
,如果沒有通過 dbt test,下游的 model 就不會繼續更新。
我們在 Cloud IDE 執行 dbt build
可以看到若 stg_orders 的 status 檢核失敗,下游的 model: customers 就不會繼續更新。
最後,請將 "製造 test 失敗情境" 的修改復原,請復原到 "加入更多 tests" 這個段落的 yaml 檔的內容。
提交今日的變更,結束這一天。
今天我們示範了如何透過 yaml 檔定義基本的內建 tests,以及 test 如果失敗會發生什麼事。
透過指令 dbt build
,我們可以將 dbt test
與 dbt run
結合,在定時更新的排程中,加入檢核。
明天的主題:dbt Documentation,文件是團隊合作很重要的資源,明天將來示範 dbt 如何產出及檢視文件。
歡迎加入 dbt community
對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加