top of page

Make SQL Great Again! dbt 為沉悶的 SQL 資料轉換注入新活力

  • 作家相片: Chen Max
    Chen Max
  • 2024年8月7日
  • 讀畢需時 3 分鐘

已更新:2024年9月5日


在現代資料棧 ( MDS ) 裡的轉換層 ( transformation layer ) 主⾓其實是 SQL ,⽽ dbt ( Data Build Tool ) 則是擔任輔助⽣成 SQL 的⾓⾊。dbt 加 SQL 的組合可以完成之前許多困難的事情。


這裏分成幾個方向介紹 dbt + SQL 可以完成的事。例如: 組合 SQL、動態生成 SQL、輔助程式語言、版本控制。



組合 SQL


SQL 有提供視圖 ( view ) 的機制:「 我們可以把任意的 SQL 查詢 (query),變成一個對應的視圖 ( view ) ,並且為其命名」。從這個角度來看, SQL view 本身就是一種模組化與抽象化機制。


模組化機制:把某個查詢變成視圖,其它的查詢⼜可以利⽤這個視圖的結果。

抽象化機制:可以對視圖加以命名。


綜合上述, SQL 的 view 機制,就已足以讓我們靈活地組合小的查詢而生成複雜的資料轉換,同時,我們所需要的資料建模 ( data modeling ) ,恰好可以由大量的視圖 ( view ) 來構成



動態⽣成 SQL


常常遇見 SQL 結構類似 ,只是些許內容不同,每當要增加新的資料表、條件 ... ,就要修改許多程式段落。


例如該公司的用戶只有 A , B , C 三個用戶,同時訂單表的欄位只有 w , x ,

y , z,SQL 的內容如下


SELECT w, x, y, z, "A" AS user_name FROM A.invoices
UNION ALL
SELECT w, x, y, z, "B" AS user_name FROM B.invoices
UNION ALL
SELECT w, x, y, z, "C" AS user_name FROM C.invoices

若用戶的數量有變動時,就要不斷的修改 SQL。


若透過 jinja 樣板語言 (template language) 動態生成相同的 SQL,就可以免除不斷大幅修改。


{% set users = ["A", "B", "C"] %}

{% for user in users %}
	SELECT w, x, y, z, '{{user}}' AS user_name
	FROM A.invoices
	{{ "UNION ALL" if not loop.last }}
{% endfor %}

如果⽇後⽤⼾的數⽬改變,只需要改變 {% set users = ... } 這⼀⾏即可以。



輔助程式語言


動態生成 SQL 可以選擇各式各樣的程式語言來做這件事,然而,該用什麼樣子的語言來輔

助動態生成 SQL 最合理呢 ?自家公司最主要的通用型程式語言嗎?還有更好的選項嗎 ?


如果選擇像 jinja 這樣子的樣板語言 ( template langauge ) 而非通用型程式語言 ( general

purpopse language ) 的話,可以有下列的優點:


  1. 樣板語言的語法相對少,因為只適合處理樣板類的應用情境。

  2. 語法相對少、所以也相對容易學習。

  3. 專案會變得對通用型程式語言 ( GPL ) 顯得語言無關 ( language agnostic )

  4. 負責維護此資料建模專案的人,進入門檻會比較低。



版本控管


如果要有系統地透過 SQL 來做出資料建模,需要做下列的事:


  1. 準備一個資料建模資料夾,裡頭放的檔案都是一個又一個的 ${model_name}.sql 檔。而檔案的內容,每個都是一個 SQL 查詢,它會生成對應的 SQL 視圖。

  2. 準備一個組態設置檔 ( config.yaml ),裡頭放一些參數,這些參數可能是用來指定資 料倉儲的連線方式,包含使用者名稱、密碼、主機名稱等。

  3. 準備一隻程式,它會結合「組態設置檔」與「資料建模資料夾」內的檔案,透過執行 jinja 語法,來產生確實可以直接對資料倉儲執行的 SQL 檔。

  4. 把步驟 3 產生的 SQL 檔,照著它們彼此相依 (dependency) 的順序,去對資料倉儲執 行。


所以要對專案做版本控管的話,只需要把前述的「資料建模資料夾」、「組態設置

檔」納入版本控管即可。



總結


綜合所述,結合 SQL 與 dbt 不僅能靈活地模組化與抽象化資料查詢,還能利用動態生成技術簡化資料處理。通過樣板語言 jinja,可以降低學習曲線及難度。搭配版本控制,能更有效管理與追蹤資料建模變更。




作者簡介


陳家宏 (Laurence Chen),從事十年以上的軟體開發,現職 IT 顧問,同時也是 Clojure 社群、dbt Taipei 社群的線下活動主辦人之一。

主要協助企業導入現代資料棧 (modern data stack)、改善資料處理、軟體開發、應用資料分析。著有《從錯誤到創新:跨領域的錯誤處理、創新之道》。

Comments


Logo-white-450px.png

地址:24251 新北市新莊區中央路700號2樓

電話:(02) 8522-7744

© 2023 Qubix. All rights reserved.

bottom of page