iT邦幫忙

2024 iThome 鐵人賽

DAY 2
3

dbt macro 介紹

macro 是 dbt 中非常重要的功能。本文以及後續幾篇文章將深入探討 dbt 中的 macro,包括其基本概念、使用場景、內建 macro 以及如何用 macro 管理 BigQuery UDF。

什麼是 macro

在 dbt 中,macro 是由 Jinja 語言和 SQL 結合而成的可重用代碼片段。Jinja 是一個專為 Python 設計的模板引擎,主要用於網頁開發和生成動態內容。

dbt 選擇使用 Jinja 是因為其強大的模板功能能使 SQL 代碼更加靈活和可重用,這正是數據轉換過程中經常需要的特性。Jinja 具有以下幾個特點:

  1. 模板繼承:可以建構基本模板並讓其他模板繼承,提高重用性和維護性
  2. 控制結構:支援條件判斷(if、else)和迴圈(for)
  3. 過濾器:提供眾多內建過濾器,用於轉換變數輸出格式
  4. 模板變量:允許在模板中插入變數

以下是使用 Jinja 生成 HTML 的範例:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ heading }}</h1>
    <ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
</body>
</html>
from jinja2 import Environment, FileSystemLoader

# 設定 Jinja 環境和模板位置
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('example.html')

# 資料
data = {
    'title': '範例頁面',
    'heading': '歡迎來到我的網站',
    'items': ['Python', 'Jinja', '模板引擎']
}

# 套用模板
output = template.render(data)

print(output)

就可以生成以下的內容

<!DOCTYPE html>
<html>
<head>
    <title>範例頁面</title>
</head>
<body>
    <h1>歡迎來到我的網站</h1>
    <ul>
        <li>Python</li>
        <li>Jinja</li>
        <li>模板引擎</li>
    </ul>
</body>
</html>

dbt 使用 Jinja 結合 SQL 來構建可重複使用的函式,這些函式稱為 macro,可被其他 macros 和 models 調用。(Jinja 也可直接用於 models 中)

何時需要使用 macro?

以下情境適合考慮將 SQL 語法打包成 macro:

  1. SQL 中存在大量重複語法。例如,將年齡轉換為年齡區間時需要寫多行 CASE WHEN 語句,可透過 macro 來生成。
  2. 多個 models 中經常使用的轉換邏輯(且無法使用 BigQuery UDF 實現)。
  3. 需要根據一個 query 的結果來生成另一個 query。

以上就是 macro 的簡介。下一篇文章將詳細介紹如何將上述情境寫成 macro。

參考

  • dbt macro 介紹:https://docs.getdbt.com/docs/build/jinja-macros

上一篇
鐵人賽系列文章介紹
下一篇
Macro 基礎用法
系列文
dbt 修煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言