iT邦幫忙

2023 iThome 鐵人賽

DAY 15
1

如何使用 dbt incremental 增量更新你的資料?

dbt incremental 定義

dbt 用增量的方式更新你的資料。平常若你沒特別設定,dbt run 預設是全量(整張表)更新 table,可以從 target 資料夾/models/model.sql 找到你每次 dbt run 跑完的語法

create or replace view `datapool-1806`.`distell_sql_lounge`.`Redeem_Monthly`
  OPTIONS()
  as SELECT.....

為何要用增量更新 table ?

→節省運算資源

使用時機

  1. 本來全量 model 更新時間太久
  2. 你的雲端資料庫費用是以量計價,且該model query 資料量大

如何使用 incremental

  • 於 model config 或 dbt_project.yml 設定 materialized = 'incremental'

  • incremental 模式

    1. 直接 append 新資料
      執行 dbt run 會直接 append query 的資料到目標 table
    {{
        config(
            materialized='incremental'
        )
    }}
    
    select
        *,
        my_slow_function(my_column)
    
    from raw_app_data.events
    
    
    1. 根據篩選條件 append 新資料
      若 model 加上 macro {% if is_incremental() %} ,只會 append 篩選條件的資料
{{
    config(
        materialized='incremental'
    )
}}

select
    *,
    my_slow_function(my_column)

from raw_app_data.events

  -- 以下只會在 incremental 情況下執行
{% if is_incremental() %}
  -- 邏輯:資料的 event_time > 上次執行最後 event_time 之資料 才會 insert)
  where event_time > (select max(event_time) from {{ this }})

{% endif %}
    3. **設定 key 值,使用其他增量策略**

若設定 unique_key 值,dbt 會根據策略和 key 值更新資料,且 key 值可以有多個

bigquery 的策略

  1. merge (預設,比對到 key 則 update 該筆,沒比對到則 insert)
  2. insert_overwrite(若使用此策略不需設定 key 值)

其他 database 使用策略請參考 incremental_strategy,大家也可以執行完後去 target 資料夾看執行的語法

{{
    config(
        materialized='incremental',
        unique_key='date_day' -- 若有多個 key 需寫成陣列 ['date_day', 'user_id']
    )
}}

select
    date_trunc('day', event_at) as date_day,
    count(distinct user_id) as daily_active_users

from raw_app_data.events

{% if is_incremental() %}

  where date_day >= (select max(date_day) from {{ this }})

{% endif %}

group by 1

注意事項

  • 有關 {% if is_incremental() %} 的用法

    • model 中 {% if is_incremental() %} 這段 macro 有以下3個條件才會觸發:
      1. 目的地已有 table 存在
      2. dbt run 沒有 full-refresh flag
      3. 你的 model 有加上 config materialized='incremental'
  • 若有設 key 沒設定 is_incremental ?

    這次 incremental 會把來源 query 全部比對目標 table,若有設 is_incremental macro,會減少來源資料量,因此計算量也會降低

  • 你的 model 需要重新建立 table

    跑 dbt run 後加上 --full-refresh flag 就可以全量更新

$ dbt run --full-refresh --select my_incremental_model+

上一篇
data quality 系列 - 如何透過 elementary 通知 dbt test 結果?
下一篇
dbt snapshot 介紹 - 怎麼設定? 各種 snapshot 策略有什麼差異? 有什麼要注意的?
系列文
如何借助 dbt 優化當代資料倉儲及資料工程師的水肥之路分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言