ワークシート5: dbt モデル設計
各 dbt モデルについて、マテリアライゼーション、エンジン、増分戦略を設定します。回答ごとに即時にフィードバックが返ります。
所要時間の目安: 15〜20分 参照: dbt on ClickHouse
概念
ワークシート1〜4が生み出したのは 何を です。どのエンジンか、どの ORDER BY か、どの ClickHouse の型か。このワークシートが生み出すのは どう です。SQL を1行も書く前に、それらの判断を dbt の 設定としてどう表現するかです。
dbt-clickhouse のモデルには、Snowflake の開発者が考える必要のなかった3層の設定があります。
- マテリアライゼーション — dbt はどの物理オブジェクトを作るのか(view、table、 incremental、ephemeral)?
- エンジン設定 — table および incremental のモデルについて、どの ClickHouse エンジンと バージョンカラムを使うのか?
- 増分戦略 — incremental のモデルについて、dbt は新規行・更新行をどう扱うのか?
さらに ReplacingMergeTree に固有の、正しさに関わる論点があります。
- FINAL の置き場所 — 重複排除された読み取りを保証するために、dbt の DAG のどこに
FINALを置くのか?
マテリアライゼーションには次のデシジョンツリーを使ってください。
- ソースからの追記のみの読み取りで、モデル自身への書き込みがない? →
view - 純粋な join のロジックで、直接クエリされない? →
ephemeral - dbt の実行ごとにフルリビルドし、部分更新はない? →
table - 実行ごとに新規行・変更行だけを処理する? →
incremental
ステージングモデルは常に view です — ワークシート1と同じルールです。stg_trips と
stg_taxi_zones は自身の書き込みを持たない素通しの読み取りなので、ソースデータの振る舞いに
関係なく view のままです。
演習1: マテリアライゼーションの選定
各モデルについて、正しい dbt のマテリアライゼーションを選び、そのうえで表の下の問いでその理由に 答えてください。
演習2: エンジン設定
ClickHouse のエンジンが必要なのは、マテリアライゼーションが table または incremental の
モデルだけです — view と ephemeral のモデルには何もありません。ワークシート1の回答を参照して
ください。dbt のエンジン設定は、そこですでに下したエンジンの判断を実装したものです。
演習3: 増分戦略の設計
各 incremental モデルについて、増分設定を丸ごと設計してください。unique_key、
incremental_strategy、そして is_incremental() のガードブロック内に入る SQL のフィルタです。
{% if is_incremental() %}
WHERE <your filter here>
{% endif %}演習4: FINAL の置き場所
ReplacingMergeTree の重複排除は非同期です。FINAL は読み取り時にそれを強制します — ただし
FINAL を誤ったモデルに置くと、正しさか性能に影響が出ます。以下の各モデルについて、FINAL が
そのモデル自身の FROM 句に属するかどうかを答えてください。
Loading worksheet...
migration-plan.md への転記
このワークシートを終えたら、migration-plan.md のセクション10に回答を記入し、次を
チェックしてください。
- [ ] dbt model design: completed