什麼是 Packages?
就像 Python 有 PyPI、Node.js 有 npm 一樣,dbt 也有自己的套件管理系統。
Packages 是由 dbt 社群維護的程式碼庫 (Models, Macros, Tests)。透過安裝 Packages,我們可以站在巨人的肩膀上,直接使用別人寫好的強大功能,而不需要自己從頭造輪子。
所有的套件都可以在 dbt Hub 上找到。
安裝 Package
要安裝套件,你需要在專案根目錄下建立一個 packages.yml 檔案。
以下示範安裝最熱門的套件 dbt-utils,它包含了數十個實用的 SQL 工具 (如 surrogate key, date spine 等)。
建立
packages.yml:packages: - package: dbt-labs/dbt_utils version: 1.1.1 # 請上 dbt Hub 確認最新版本執行安裝指令:
dbt depsdbt 會將套件下載到
dbt_packages/(舊版為modules/) 資料夾中。注意:這個資料夾通常已經在.gitignore中被忽略,因為它屬於外部依賴。
使用 Package
安裝好後,你就可以在自己的 SQL 中引用套件裡的 macros。引用方式通常是 {{ 套件名.宏名稱() }}。
產生唯一鍵 (generate_surrogate_key)
假設我們沒有單一的主鍵,需要組合 order_id 和 product_id 來產生一個唯一鍵 (Surrogate Key)。
沒有 dbt_utils 時,你可能要手寫 MD5 concat 語法,而且不同資料庫語法還不一樣。有了 dbt_utils:
select
{{ dbt_utils.generate_surrogate_key(['order_id', 'product_id']) }} as item_key,
order_id,
product_id
from {{ ref('order_items') }}
dbt-utils 會自動根據你的資料庫類型 (Postgres, BigQuery 等),編譯出正確的 Hash 函數 SQL。
快速選取欄位 (star)
當你想 select * 但又要排除某幾個敏感欄位 (例如 PII 個資) 時,star 非常好用:
select
{{ dbt_utils.star(from=ref('raw_users'), except=["email", "phone_number"]) }}
from {{ ref('raw_users') }}
這會自動展開成除了 email 和 phone_number 以外的所有欄位,避免你手寫一長串欄位名稱。
自動 GROUP BY (group_by)
當你的 select 欄位非常多,手寫 group by 1, 2, 3... 既麻煩又容易算錯。
select
user_id,
city,
gender,
count(*) as total_orders
from {{ ref('orders') }}
{{ dbt_utils.group_by(3) }}
這會自動生成 group by 1, 2, 3 (或者根據資料庫語法生成對應欄位名)。
產生日期維度 (date_spine)
在做分析時,我們常需要一張連續日期的「日曆表」來做 Join (例如補齊沒有交易日期的數據)。
{{ dbt_utils.date_spine(
datepart="day",
start_date="cast('2023-01-01' as date)",
end_date="cast('2024-01-01' as date)"
)
}}
這會直接生成一段 SQL,回傳 2023 全年的每一天日期資料。
常見實用 Packages
除了 dbt-utils,還有許多常見的套件:
dbt-expectations: 提供類似 Great Expectations 的進階資料測試 (例如檢查欄位平均值、標準差)。audit_helper: 幫助你在重構 SQL 時,比對新舊 query 的結果差異。spark_utils/snowflake_utils: 針對特定資料庫的最佳化工具。
總結
開始一個新 dbt 專案時,第一件事通常就是安裝 dbt-utils。善用 Packages 可以讓你的專案更標準化,並大幅節省開發時間。