昨天我們在 dbt Cloud 把我們的專案建立起來了,目前只有一個 model: customers。
今天的主題 Modularize Our dbt Models -- 將我們的 model 模組化,我們要來把一個 model 拆成模組(多個 model)。
過去傳統的 SQL 撰寫方式,常常會發生的狀況:成千上百行 SQL寫成一大坨,難以閱讀、很多重複語法,到處貼來貼去,最後失去控制,無法維護。
我們可以將一大坨包含子查詢的 SQL,用 CTE (Common Table Expression),整理成較有條理的格式。雖然跟效能沒太大關係,卻能大大提高可讀性。CTE 也就是昨天建立的 customers model 中, with
的寫法。(還是不清楚的話,也可以參考最下面附的連結)
CTE 雖然已經比一大坨錯綜複雜的 SQL 好讀很多了,但在 dbt 的世界中,我們可以更進一步,將這些 CTE 再拆成多個 models。每個 model 不僅較方便除錯,更是可以重複利用的模組,我們還能將之間的關聯以文件及圖形化的方式呈現。
customers model 包含的四個 CTE 為:
現在我們要來把 customers 和 orders 拆出來。
在 models 底下新增資料夾:staging,並在裡面新增兩個檔案:
再把 customers model 中,customers 和 orders 兩個 CTE 的內容分別貼到新增的兩個檔案。
接下來,把 customers model 中,原本 CTE 的內容,替換成以下 ref 語法,就可以引用那兩個 model 的語法。
select * from {{ ref('stg_customers') }}
select * from {{ ref('stg_orders') }}
完成後,點開下方的 Lineage 頁籤,可以查看這些 model 之間的關係圖。
接下來我們要進一步把 stg_customers 和 stg_orders,使用到原始 table 的部份,進一步拆到 sources.yml。
在 models/staging 資料夾底下,建立檔案 sources.yml,貼入以下語法:
version: 2
sources:
- name: jaffle_shop
database: dbt-tutorial
schema: jaffle_shop
tables:
- name: orders
- name: customers
再將 stg_customers, stg_orders 這兩個 model 中,from 的部份,換成 source 的語法:
from {{ source('jaffle_shop', 'customers') }}
from {{ source('jaffle_shop', 'orders') }}
完成後,可以看到 Lineage 中,我們目前的資料流為 sources -> staging -> customers。
這樣的作法還有一個好處,總共用到哪些 table,我們可以完整在 sources.yml 一個檔案列出,一目了然。
今天我們把一大坨 SQL 拆成了 staging models 以及 source。
模組化的好處多多,也是我在使用 dbt 之前完全沒想過的做法。
最後,提交今天的異動<結束這一天。
明天的主題:dbt run、materializations,也就是這些在 dbt Cloud 建立的這些 dbt model,和我們的 BigQuery 到底有什麼關聯。
歡迎加入 dbt community
對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加