iT邦幫忙

2023 iThome 鐵人賽

DAY 8
1
AI & Data

dbt: 告別過時的SQL開發流程系列 第 8

DAY 08 - dbt Cloud 入門 (6) - 加入 tests, dbt test & dbt build

  • 分享至 

  • xImage
  •  

今天的主題是 tests。
dbt 有很多種 test 的方法,今天只講最基本內建的 generic tests (舊名 schema tests),只要在 yaml 檔即可定義 tests。


昨天暫時進入 Deploy,今天要回到 Develop 的部份。

回到 Cloud IDE 的時候會發現黃色的 Pull from "main"
按下去就對了,這個是由於系統偵測到 main branch 前兩天有異動,所以我們要按下去,確保 main branch 的異動有併入目前的分支。
https://ithelp.ithome.com.tw/upload/images/20230917/20159575bXpOwQASyz.png


為什麼需要 dbt tests

在SQL開發流程中,我們有時會寫錯語法,例如 join 錯欄位,資料膨脹兩倍,數字直接全錯。

為了不要出錯,我們必須付出200%的專注力;為了不要出錯,寫完 SQL 要再多檢查2遍;為了不要出錯,最後再花2倍時間比對數字。人生,真難。

dbt tests 可以幫助我們更容易的驗證資料。例如,特定欄位組合不重複。又例如,兩個 table 的數字加總相同。

dbt tests 不僅幫助驗證資料,不再需要把資料抓到 excel 拉來拉去,dbt test 更是我們資料排程的一部分。只要沒通過 test 的 model,就不會再污染下游資料。


加入 tests

首先我們要在 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。
https://ithelp.ithome.com.tw/upload/images/20230806/20159575Xw7l4kSCSs.png


加入更多 tests

dbt 內建的 generic tests 總共有四種:

  • Not Null
  • Unique
  • Relationships
  • Accepted Values

現在我們要來加入更多 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:

  • unique
  • not null

也可以定義欄位只允許哪些值

      	- accepted_values:
          	values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

再來也可以定義欄位允許的值,必須存在於另外一個 model,類似 foreign key 的概念。

      	- relationships:
          	to: ref('stg_customers')
          	field: customer_id

test 失敗會發生什麼事?

讓我們來製造一個 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,可以看到該檢核出現紅色的叉叉。
https://ithelp.ithome.com.tw/upload/images/20230806/20159575kquA0v6xJ0.png


dbt build

現在要來介紹一個新的指令:dbt build

引用官方文件

The dbt build command will:

  • run models
  • test tests
  • snapshot snapshots
  • seed seeds

這個指令可以結合 dbt rundbt test,如果沒有通過 dbt test,下游的 model 就不會繼續更新。

我們在 Cloud IDE 執行 dbt build
可以看到若 stg_orders 的 status 檢核失敗,下游的 model: customers 就不會繼續更新。
https://ithelp.ithome.com.tw/upload/images/20230806/20159575Nk8ZuJr7Rv.png


今日小結&明日預告

最後,請將 "製造 test 失敗情境" 的修改復原,請復原到 "加入更多 tests" 這個段落的 yaml 檔的內容。

提交今日的變更,結束這一天。
https://ithelp.ithome.com.tw/upload/images/20230923/20159575oUNbAC3WSJ.png

今天我們示範了如何透過 yaml 檔定義基本的內建 tests,以及 test 如果失敗會發生什麼事。
透過指令 dbt build,我們可以將 dbt testdbt run 結合,在定時更新的排程中,加入檢核。

明天的主題:dbt Documentation,文件是團隊合作很重要的資源,明天將來示範 dbt 如何產出及檢視文件。

參考資料


歡迎加入 dbt community
對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加


上一篇
DAY 07 - dbt Cloud 入門 (5) - dbt Cloud Deployment
下一篇
DAY 09 - dbt Cloud 入門 (7) - 產出及查看 dbt 文件 (dbt docs generate )
系列文
dbt: 告別過時的SQL開發流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言