iT邦幫忙

2023 iThome 鐵人賽

DAY 5
2
AI & Data

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

DAY 05 - dbt Cloud 入門 (3) - Modularize Our dbt Models

  • 分享至 

  • xImage
  •  

昨天我們在 dbt Cloud 把我們的專案建立起來了,目前只有一個 model: customers。
今天的主題 Modularize Our dbt Models -- 將我們的 model 模組化,我們要來把一個 model 拆成模組(多個 model)。


模組化的好處 - SQL 語法的維護性及可讀性

過去傳統的 SQL 撰寫方式,常常會發生的狀況:成千上百行 SQL寫成一大坨,難以閱讀、很多重複語法,到處貼來貼去,最後失去控制,無法維護。

我們可以將一大坨包含子查詢的 SQL,用 CTE (Common Table Expression),整理成較有條理的格式。雖然跟效能沒太大關係,卻能大大提高可讀性。CTE 也就是昨天建立的 customers model 中, with 的寫法。(還是不清楚的話,也可以參考最下面附的連結)

CTE 雖然已經比一大坨錯綜複雜的 SQL 好讀很多了,但在 dbt 的世界中,我們可以更進一步,將這些 CTE 再拆成多個 models。每個 model 不僅較方便除錯,更是可以重複利用的模組,我們還能將之間的關聯以文件及圖形化的方式呈現。


第一步:從 customers model 拆出 staging models

customers model 包含的四個 CTE 為:

  • customers
  • orders
  • customer_orders
  • final

https://ithelp.ithome.com.tw/upload/images/20230917/20159575yQDVrLPsFD.png

https://ithelp.ithome.com.tw/upload/images/20230917/20159575QeYkyPs3Jf.png

現在我們要來把 customers 和 orders 拆出來。

在 models 底下新增資料夾:staging,並在裡面新增兩個檔案:

  • stg_customers.sql
  • stg_orders.sql

再把 customers model 中,customers 和 orders 兩個 CTE 的內容分別貼到新增的兩個檔案。

https://ithelp.ithome.com.tw/upload/images/20230917/20159575WPh6q1RFFD.png

https://ithelp.ithome.com.tw/upload/images/20230917/20159575Tj44VqOB9v.png

接下來,把 customers model 中,原本 CTE 的內容,替換成以下 ref 語法,就可以引用那兩個 model 的語法。

select * from {{ ref('stg_customers') }}
select * from {{ ref('stg_orders') }}

完成後,點開下方的 Lineage 頁籤,可以查看這些 model 之間的關係圖。
https://ithelp.ithome.com.tw/upload/images/20230917/201595759mo1bvnXjI.png


進一步拆解:source

接下來我們要進一步把 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

https://ithelp.ithome.com.tw/upload/images/20230917/20159575Ug5WZgkr8a.png

再將 stg_customers, stg_orders 這兩個 model 中,from 的部份,換成 source 的語法:

from {{ source('jaffle_shop', 'customers') }}
from {{ source('jaffle_shop', 'orders') }}

https://ithelp.ithome.com.tw/upload/images/20230917/20159575ihnwQ6Om60.png

https://ithelp.ithome.com.tw/upload/images/20230917/20159575ML8vtldeXm.png

完成後,可以看到 Lineage 中,我們目前的資料流為 sources -> staging -> customers。
https://ithelp.ithome.com.tw/upload/images/20230917/201595758yXHGTJt8z.png

這樣的作法還有一個好處,總共用到哪些 table,我們可以完整在 sources.yml 一個檔案列出,一目了然。


今日小結&明日預告

今天我們把一大坨 SQL 拆成了 staging models 以及 source。
模組化的好處多多,也是我在使用 dbt 之前完全沒想過的做法。

最後,提交今天的異動<結束這一天。
https://ithelp.ithome.com.tw/upload/images/20230917/20159575Kqffi8LWjg.png

明天的主題:dbt run、materializations,也就是這些在 dbt Cloud 建立的這些 dbt model,和我們的 BigQuery 到底有什麼關聯。

參考資料


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


上一篇
DAY 04 - dbt Cloud 入門 (2) - 初始化專案、建立 Model
下一篇
DAY 06 - dbt Cloud 入門 (4) - dbt run、materializations
系列文
dbt: 告別過時的SQL開發流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言