1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

is_incrementalマクロの使い方の例

Posted at

はじめに

こんにちは、森田と申します。
このたび、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'である前提で、自己参照する処理を考えてみます。

myTabele.sql
{{
    config(
        materialized='incremental'
    )
}}

select * from {{ this }}
union all 
select * from {{ new_my_table }}

これをdbt runで初回実行しようとすると{{ this }}で自身を参照しているため、コンパイルされたタイミングで、{{ this }}がmytableに書き換わり、実行のタイミングで初回実行のため、まだmyTabeleは存在していないため、参照エラーになって実行できません。(以下、コンパイル例)

myTabele.sql
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も初回は不要なので含めることを忘れずに!!

myTabele.sql
{{
    config(
        materialized='incremental'
    )
}}

{% if is_incremental() %}
select * from {{ this }}
union all 
{% endif %}
select * from {{ new_my_table }}

初回実行時は、データベース内のテーブルとして既に存在していないのでis_incremental()がfalseを返して、is_incremental()で囲った部分が削除されます。

myTabele.sql
select * from xxxx.xxxx.new_my_Tabele

2回目以降は、my_Tabeleが存在するため、is_incremental()がtrueを返して、is_incremental()で囲った部分が追記されます。

myTabele.sql
select * from xxxx.xxxx.myTabele
union all 
select * from xxxx.xxxx.new_my_Tabele

incrementalモデルの初回実行時に動かしたくない、動かすとエラーになる処理はis_incremental()アクロを利用することでわざわざ手作業などで事前にテーブルを作らずにモデルを作成することができます。

終わりに

dbtは、SQLの汎用性の低い部分を補いつつ、やりたいと思うことがほとんど事前に揃っている最高のツールです。生SQLでAI学習データを作っていたあの頃に自分に欲しかった機能が詰まってます。
ぜひ、皆様も使ってみてください!!

以上!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?