什麼是 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 等)。

  1. 建立 packages.yml

    packages:
      - package: dbt-labs/dbt_utils
        version: 1.1.1 # 請上 dbt Hub 確認最新版本
    
  2. 執行安裝指令:

    dbt deps
    

    dbt 會將套件下載到 dbt_packages/ (舊版為 modules/) 資料夾中。注意:這個資料夾通常已經在 .gitignore 中被忽略,因為它屬於外部依賴。

使用 Package

安裝好後,你就可以在自己的 SQL 中引用套件裡的 macros。引用方式通常是 {{ 套件名.宏名稱() }}

產生唯一鍵 (generate_surrogate_key)

假設我們沒有單一的主鍵,需要組合 order_idproduct_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 專案時,第一件事通常就是安裝 dbt-utils。善用 Packages 可以讓你的專案更標準化,並大幅節省開發時間。