はじめに
こんにちは、森田と申します。
このたび、dbt Analytics Engineering Certification Examに合格しましたので!!
勉強した中で、実務でも役にたったis_incrementalマクロについて、深掘り紹介したいと思います。
一応、dbt Analytics Engineering Certification Examの詳細は↓を見てもらえればと思います!
https://www.getdbt.com/dbt-certification
学習する際は、↓を参考にするといいです。
https://www.getdbt.com/dbt-assets/certifications/dbt-certificate-study-guide
勉強する際の注意点としては、まず全編英語です。教材も試験、試験官との会話もすべて英語です。
そもそも教材が二十時間分ぐらいありますが、字幕に日本語選択ないので英語のリスニングと字幕のリーディングで頑張る感じですので少し骨が折れますが、実践に使える内容が多いので勉強して損はないです。
さて、前置きはこのくらいにして、本編に入ります。
本編 is_incrementalマクロとは
dbtのモデルでmaterialized='incremental'した場合に使えるマクロです。
機能としては以下条件を満たす際にtrueを返すマクロです。
- データベース内のテーブルとして既に存在している必要があります
- full-refreshが渡されていない。
ちょっと、この条件だけだと使い道が分かりずらいですよね。。。。
使い方を考えてみましょう!
実行中のモデルは、materialized='incremental'である前提で、自己参照する処理を考えてみます。
{{
config(
materialized='incremental'
)
}}
select * from {{ this }}
union all
select * from {{ new_my_table }}
これをdbt runで初回実行しようとすると{{ this }}で自身を参照しているため、コンパイルされたタイミングで、{{ this }}がmytableに書き換わり、実行のタイミングで初回実行のため、まだmyTabeleは存在していないため、参照エラーになって実行できません。(以下、コンパイル例)
select * from xxxx.xxxx.myTabele
union all
select * from xxxx.xxxx.new_my_Tabele
では、incrementalモデルで自己参照をして、初回(実体化前)でも実行できるようにするにはどうすれば良いでしょうか?
はい、is_incrementalマクロです。もう一度条件を見返すと
以下条件を満たす際にtrueを返します。
- データベース内のテーブルとして既に存在している必要があります
- full-refreshが渡されていない。
つまり、初回実行の際は、データベース内のテーブルとして既に存在していないのでfalseを返して、記載した処理が無視されるように制御できます。
先ほどの例にis_incrementalマクロを追加してみましょう。
{{ this }}で自身を参照しているすると初回でエラーになるためマクロで囲みます。union allも初回は不要なので含めることを忘れずに!!
{{
config(
materialized='incremental'
)
}}
{% if is_incremental() %}
select * from {{ this }}
union all
{% endif %}
select * from {{ new_my_table }}
初回実行時は、データベース内のテーブルとして既に存在していないのでis_incremental()がfalseを返して、is_incremental()で囲った部分が削除されます。
select * from xxxx.xxxx.new_my_Tabele
2回目以降は、my_Tabeleが存在するため、is_incremental()がtrueを返して、is_incremental()で囲った部分が追記されます。
select * from xxxx.xxxx.myTabele
union all
select * from xxxx.xxxx.new_my_Tabele
incrementalモデルの初回実行時に動かしたくない、動かすとエラーになる処理はis_incremental()アクロを利用することでわざわざ手作業などで事前にテーブルを作らずにモデルを作成することができます。
終わりに
dbtは、SQLの汎用性の低い部分を補いつつ、やりたいと思うことがほとんど事前に揃っている最高のツールです。生SQLでAI学習データを作っていたあの頃に自分に欲しかった機能が詰まってます。
ぜひ、皆様も使ってみてください!!
以上!