今回の課題
dbt test
コマンドを実行すると、基本的にデータが全量スキャンされ、コストが高いクエリになってしまう。
コストを削減するために、
毎日特定の時間に一度、増分更新が行われているテーブルに対しては、
増分更新が実施されたデータに対してのみ、テストが走る方法調査して実装してみることにした。
※参考:dbtとデータパーティショニングで、大量データを扱う(dbt test)
実装方法
1)dbt modelが走った時間をカラム化する
下記のように_last_dbt_run_at
カラムに、dbt model
コマンドが走った日の日付を格納するようにする。
/* model */
select
*
, {{ dbt.date_trunc('day', dbt.current_timestamp()) }} as _last_dbt_run_at -- dbt runを実施した日のカラムがtimestamp型で生成される
from
`テーブル名`
2)_last_dbt_run_at
で、test範囲を絞り込む
上記で作成した_last_dbt_run_at
カラムを使って、schema.yml
ファイルにてtest範囲を絞り込む。
一日一回、増分更新が実施されるので、前日から増分更新で追加されたデータに対して、テストが走るように実装したい。
そこで、下記のように_last_dbt_run_at
の日程が、dbt test
を実行した日程の前日以降のものとなっているデータに対して、スキャンが走るように記述した。
# schema.yml
version: 2
models:
- name: [モデル名]
columns:
- name: [カラム名]
tests:
- not_null:
config:
where: "_last_dbt_run_at >= date_sub(date_trunc(current_timestamp(), day), interval 1 day)"
以上のようなかたちで、dbt test
時のデータのスキャン量を減らし、クエリのコストの削減を実現した。