iT邦幫忙

2023 iThome 鐵人賽

DAY 9
1
AI & Data

如何借助 dbt 優化當代資料倉儲及資料工程師的水肥之路分享系列 第 9

dbt 如何客製化 bigquery table 命名? dbt custom alias 原理,使用方式及我們的做法

  • 分享至 

  • xImage
  •  
  • dbt alias 是什麼?

    dbt alias 是指自定義 table 名稱的方法,dbt 會預設 database 的 table 名稱為你的 model.sql  檔名,若你的 model 設定 alias ,database 就會產生 alias 的 table 名稱
    
  • 為何要用 alias

    情境1. dbt project 內 model.sql 檔名重複
    假設你的公司有兩個產品或兩家客戶,只有一個 data team,所以資料要在同個 dbt project 執行,雖然在不同 bigquery project.dataset,但又剛好都有表名 member,這時你只要跑 dbt run 就會出現 error

    https://ithelp.ithome.com.tw/upload/images/20230924/20162689XWVlASboPW.png

    情境2. 在某些情況下,預設的 table 名稱可能不太直觀或不符個人喜好,想在 database 設定不同名稱

    →以上情況都可以用 custom alias 解決

  • 怎麼使用?

    1.在 model.sql 上 config 加入 alias,model 檔名改為 datamart_member

    -- models/migocorp/internal/datamart/datamart_member.sql
    
    {{ config(alias='member') }}
    
    select * from ...
    

    這時你的 model 檔名雖然是 datamart_member.sql,dbt run 後在 database table name是 member

  1. 在 schema.yml 設定 alias
# models//migocorp/schema.yml
version: 2

models:
  - name: datamart_member
    config:
      alias: member
  - name: analytical_member
    config:
      alias: member

在前面 dbt 各種設定要寫在哪,怎麼寫? 提到,各種 config 設定可以寫在 schema.yml,alias 就是一種 config,所以你可以把你要改 table 名稱的 model 統一寫在 schema.yml 統一管理

  1. 進階做法:改 get_custom_alias.sql 寫法

作法與調整 get_custom_schema.sql 類似,不需要一個個設定 table alias
原始的 get_custom_alias 如下,有 custom_alias_name 就會用 alias,沒有就用 model 檔名

{% macro generate_alias_name(custom_alias_name=none, node=none) -%}

    {%- if custom_alias_name is none -%}

        {{ node.name }}

    {%- else -%}

        {{ custom_alias_name | trim }}

    {%- endif -%}

{%- endmacro %}

migo 的 data team 團隊為了避免 model 檔名重複,我們在一開始命名就加入資料夾層級的命名,幫助區別 model 的所屬 project。 例如上方案例兩個衝突的 member 檔案路徑如下:

我們在檔名加入”.” ,因此各自變成如下, dbt 就會判斷是不同 model 檔

這時只要再調整 get_custom_alias.sql 的一段語法

{% macro generate_alias_name(custom_alias_name=none, node=none) -%}

    {%- if custom_alias_name is none -%}

        {{ set name_list = node.name.split('.' }}
				{{ name_list|last }}
			...

    {%- endif -%}

{%- endmacro %}

跑 dbt run 時語法只取 ”.” 的最後,因此在 bigquery 上一樣會命名成 member,但是是在各自的 dataset

若你的團隊統一 dbt 的 table 命名規則,就可完美區別不同 project 同 table 名稱的問題,且不需管理 schema.yml 設定檔各 table 命名


上一篇
如何用 dbt 客製化命名 bigquery dataset? dbt custom schema 原理及使用方式
下一篇
dbt 指令的參數介紹(下)-如何透過 dbt 變數區分測試環境
系列文
如何借助 dbt 優化當代資料倉儲及資料工程師的水肥之路分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言