マテリアライゼーション とは
マテリアライゼーションとは、dbtのモデルを作成するときのデータの定義です。dbtでは次の4種類のマテリアライゼーションを選択することができます。
- View
- Table
- Ephemeral
- Incremental
マテリアライゼーションの選択は、クエリの実行時間やマクロ機能など、下流への影響を考慮することが重要になります。
View
モデルは実行のたびにCREATE VIEW as
ステートメントを介して再構築されます。dbtではマテリアライゼーションを指定しない場合はがデフォルトでViewになります。Viewモデルは次の特徴があります。
- データの移動が発生しないため高速にモデルを構築できる
- 大きな変換を行うViewや、他のViewの上に重ねられたViewはクエリに時間がかかる
Table
モデルは実行のたびにCREATE TABLE as
ステートメントを介して再構築されます。Tableモデルは次の特徴があります。
- 一般的にViewよりもクエリが高速
- 大きなデータを毎回入れ直す場合はコストや実行時間の問題が発生する
Ephemeral
EphemeralモデルはDWH上にモデルが生成されず、CTE(共通のテーブル)として扱われ、依存するモデルに補間します。つまり、Ephemeralモデルはそれ自体がデータモデルとして生成されませんが、他のデータモデルからの参照としては認識されるということになります。
Incremental
Incrementalモデルでは、初回はTableとして生成され、以降は再構築せずに増分更新されます。Incrementalモデルは前回実行時との差分を特定するため、そのロジックとis_incremental()
というマクロの設定が必要になります。
マテリアライゼーションの設定
dbtのモデルはデフォルトではViewとして実体化されます。モデルは次のようにmaterialized
の設定パラメータでマテリアライゼーションを指定します。
# The following dbt_project.yml configures a project that looks like this:
# .
# └── models
# ├── csvs
# │ ├── employees.sql
# │ └── goals.sql
# └── events
# ├── stg_event_log.sql
# └── stg_event_sessions.sql
name: my_project
version: 1.0.0
config-version: 2
models:
my_project:
events:
# materialize all models in models/events as tables
+materialized: table
csvs:
# this is redundant, and does not need to be set
+materialized: view
また、モデルのSQLファイルの中で直接マテリアライゼーションを設定することもできます。
{{ config(
materialized='table',
)
}}
SELECT *
FROM ...
Incremental の場合
Incrementalモデルは増分更新なので、差分を判断する基準となるロジックを組み込む必要があります。次の例では、現在のデータモデルのcreated_at
カラムの最新日付よりも新しい日付のレコードのみをデータモデルに対して増分更新するという仕組みになっています。
{{
config(
materialized='incremental'
)
}}
SELECT
xxx,
yyy,
zzz,
created_at
FROM `my_table`
{% if is_incremental() %}
where created_at > (select max(created_at)) from {{ this }})
{% endif %}
初回実行時はis_incremental()
がFalseとなり、WHERE
句のないクエリが実行されます。2回目以降の実行ではis_incremental()
がTrueとなり増分更新されます。
参考