Traffine I/O

日本語

2022-12-30

マテリアライゼーション

マテリアライゼーション とは

マテリアライゼーションとは、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の設定パラメータでマテリアライゼーションを指定します。

dbt_project.yml
# 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ファイルの中で直接マテリアライゼーションを設定することもできます。

hoge.sql
{{ config(
    materialized='table',
  )
}}

SELECT *
FROM ...

Incremental の場合

Incrementalモデルは増分更新なので、差分を判断する基準となるロジックを組み込む必要があります。以下の例では、現在のデータモデルのcreated_atカラムの最新日付よりも新しい日付のレコードのみをデータモデルに対して増分更新するという仕組みになっています。

hoge.sql
{{
    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となり増分更新されます。

参考

https://docs.getdbt.com/docs/build/materializations
https://docs.getdbt.com/terms/table
https://docs.getdbt.com/terms/view
https://dev.classmethod.jp/articles/dbt-materializations-three/
https://dev.classmethod.jp/articles/dbt-materialization-incremental/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!