dbt 用增量的方式更新你的資料。平常若你沒特別設定,dbt run 預設是全量(整張表)更新 table,可以從 target 資料夾/models/model.sql 找到你每次 dbt run 跑完的語法
create or replace view `datapool-1806`.`distell_sql_lounge`.`Redeem_Monthly`
OPTIONS()
as SELECT.....
→節省運算資源
於 model config 或 dbt_project.yml 設定 materialized = 'incremental'
incremental 模式
{{
config(
materialized='incremental'
)
}}
select
*,
my_slow_function(my_column)
from raw_app_data.events
{{
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 的策略
其他 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() %} 的用法
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+