iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
AI & Data

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

DAY 20 - dbt 中階 (7) - Exposures 及 Custom Outputs

  • 分享至 

  • xImage
  •  

今天要往更下游走,Exposures 可以理解為 dbt 的 output,也就是說經過 dbt 轉換的資料都被用在哪些地方,例如我們在 Teamson 是以 Tableau 為主。

另外,本系列文章在 BigQuery 主要只有用到兩個 dataset,正式環境用 dbt_prod、開發環境用 dbt_dev。
table 或 view 的名稱則是 dbt model 的名稱。
然而某些情況,我們希望可以拆成不同 dataset,或是希望 table/view 可以使用不同於 dbt model 的名稱,這就是後半段要討論的,custom outputs。

如何定義 Exposures

在 models 資料夾底下新增 yaml 檔,檔名可以取 exposures.yml 或任何檔名皆可。
在 yaml 檔中定義 exposures,範例如下:

version: 2

exposures:

  - name: tableau_data_source
    type: analysis
    label: Tableau Data Source
    description: Analytics ready datasets for Tableau
    tags: ['business_intelligence']
    depends_on:
      - ref('customers')
    owner:
      name: Stacy Lo
  • name: exposure 的名稱,建議為 snake_case 且不得重複。
  • type: exposure 的分類,允許的值只有 dashboard, notebook, analysis, ml, application
  • label: 呈現在文件中,較易於閱讀的名稱。
  • description: exposure 的說明。
  • tags: string list,明天會再多介紹 tags 的使用方式。
  • depends_on: 選填,上游資料來源,可以為多個。
  • owner: 必填,name 或 email 至少要填一個。

定義完成後,就會在 lineage graph 呈現。
https://ithelp.ithome.com.tw/upload/images/20231001/20159575ltxyrwAEpu.png

Exposures 如何呈現在文件

定義完 exposure 之後,重新產出文件,就可以在文件頁面看到 exposures 的區塊。

https://ithelp.ithome.com.tw/upload/images/20231001/201595751rx7CGGNqy.png

Exposures 底下的資料夾是依 exposure types 分類:

  • dashboard
  • notebook
  • analysis
  • ml
  • application

資料夾底下會列出各個 exposures,顯示的是 label,較易閱讀的名稱,而非 exposure 在 dbt 內部的物件名稱。

右邊區塊文件的內容即為剛剛定義的 description, tags, 以及 depends on。

Exposure 的使用情境

以下列出一些我想到的 exposure 使用情境:

  1. 開發時,如果動到 model,可以直接在 lineage graph 檢查會影響到哪些 exposures。
  2. 如果有需要的話,可以開放下游使用者,例如 Tableau 的核心使用者,直接檢視 dbt 文件的 exposures 區塊。
  3. 執行指令的時候可以使用,例如想要一次 build 所有 Tableau 用到的 models,包含其上游,就可以這樣下: dbt build --select +exposure:tableau_data_source

如何定義 Custom Outputs

在 model 裡面的 config 即可定義 custom schema 和 alias。例如

{{
    config(
        schema='customers', 
        alias = 'primary_data'
    )
}}

Custom Schema

Schema 在 BigQuery 指的就是 dataset。
如果有設定 custom schema 的話,輸出的 dataset 就會變成 {{ default_schema }}_{{ custom_schema_name}}
以上面的例子來說,若是在開發環境

  • 原本會輸出到 dataset: dbt_dev
  • 設定完 custom schema 就會改成輸出到 dataset: dbt_dev_customers

正式環境則是

  • 原本會輸出到 dataset: dbt_prod
  • 設定完 custom schema 就會改成輸出到 dataset: dbt_prod_customers

Custom Aliases

Alias 就是別名,輸出到目標資料庫的 view 或 table,我們可以設定不同於 dbt model 的名稱。

以上面的例子來說,如果我們已經定義 dataset 為 customers,而我們的 model 名稱也叫做 customers,輸出到 BigQuery 就會變得有點像繞口令

  • dbt_dev_customers.customers
  • dbt_prod_customers.customers

這時候我們或許會想換個名稱,例如

  • dbt_dev_customers.primary_data
  • dbt_prod_customers.primary_data

覆寫預設的 Custom Schema

就算已經設定了 custom schema,出來的結果可能還是不符合期望。
現在我們輸出的結果是

  • dbt_dev_customers.primary_data
  • dbt_prod_customers.primary_data

但是在正式環境,我們可能希望 dataset 的名稱就叫做 customers,不希望包含前綴 dbt_prod_

dbt 在產生 custom schema name 的時候是用內建的 macro generate_schema_name

{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}

        {{ default_schema }}

    {%- else -%}

        {{ default_schema }}_{{ custom_schema_name | trim }}

    {%- endif -%}

{%- endmacro %}

如果我們希望使用改變邏輯,我們可以在專案底下建立同名 macro。
如果專案底下有同名 macro,就會覆蓋預設的 macro。
舉例來說我會這樣做:

{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}

        {{ default_schema }}

    {%- else -%}
        {% if default_schema == 'dbt_prod' %}
            {{ custom_schema_name | trim }}
        {% else%}
            {{ default_schema }}_{{ custom_schema_name | trim }}
        {% endif %}

    {%- endif -%}

{%- endmacro %}

這裡要注意一個地方,雖然我們希望輸出到 dataset: customers,但是只限正式環境。開發環境千萬不能也輸出到 dataset: customers,否則開發階段的操作就會影響到正式環境。

以上的例子是去判斷 target.schema,如果為 dbt_prod 的話就不要包含 {{ default_schema }}_ 的前綴,如果不是 dbt_prod 的話就維持預設。

如何判斷正式環境有好幾種方法,除了 target.schema 之外,也可以用本系列文尚未介紹到的,target.name 或環境變數去判斷。再過幾天會介紹如何在本機用 dbt Core 和 dbt Cloud 同時開發,兩邊的環境設定也是需要納入考量的的因素。


今日小結&明日預告

今天討論了 exposures 和 custom outputs,雖然是兩個不相干的主題,但都和下游輸出有關。

明天的主題:專案架構及命名原則

參考資料


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


上一篇
DAY 19 - dbt 中階 (6) - Incremental Materializations
下一篇
DAY 21 - dbt 中階 (8) - 專案架構及命名原則
系列文
dbt: 告別過時的SQL開發流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言