デフォルトでdbtのビルド対象からモデルを除外する
はじめに
こんにちは、M&Aクラウドでデータエンジニアをしている つざき です。
この記事では、dbt
においてdbt build
やdbt run
を行うときに、デフォルトで特定のモデルを除外する方法について記載します。
dbtのモデルの中には、特定のタイミングでだけビルドすればいいようなモデルもあると思います。
普段のビルドからは毎回除外したい。でも、毎度--exclude tag:some_tag
のように指定するのは面倒だったり、漏れてしまう恐れがあります。
この記事ではdbtのYAML Selectorsを使ってこの問題を解決します。
先に結論
- YAML Selectorsを使ってデフォルトのリソースセレクタを定義する
-
selectors.yml
でdefault: true
を指定したセレクタを定義する
YAML Selectors とは
dbtのYAML Selectorsとは、リソースセレクタをselectors.ymlを使って定義する仕組みです。--select
や--exclude
の条件を名前をつけて定義することができます。
たとえば、nodes_to_joy
というセレクタを定義した場合は、
dbt build --select nodes_to_joy
のように利用することができます。
selectors:
- name: nodes_to_joy
definition: ...
definition
要素で、対象となるモデルの指定や除外などの設定を行います。
たとえば、特定のtagを指定したい場合は以下のように記載することができます。
definition:
'tag:nightly'
definition
の書式は、簡易的な記載ができるCLI-style
、Key-value
と、複雑な条件を柔軟に指定できるFull YAML
の3種類あります。
条件の複雑さに応じて選択すると良いと思います。
デフォルトのセレクターの指定方法
default:true
でデフォルトのセレクタに設定することができます。
下記の例ではdbt build
を実行すると--select
といったフラグを追加しなくてもデフォルトでmy_default_selector
セレクターが指定されます。
selectors:
- name: my_default_selector
description: "説明文"
default: true
definition: ...
指定のタグを除外する例
最初の話に戻って、特定のモデルやタグ、グループを除外する方法ですが、以下のように設定します。
selectors:
- name: my_default_selector
description: "デフォルトのセレクタです。XXに関係するモデルはXXなため除外しています。"
default: true # デフォルトに設定
definition: # リソースセレクタの定義
union:
- method: fqn # 一旦全てのモデルを指定する
value: '*'
- exclude: # excludeで除外したいモデルやタグを指定する
- method: tag
value: your_exclude_model
付録: 便利な使い方
独自パッケージをインポートして必要なモデルだけビルドする
dbtにはパッケージ機能があり、プロジェクトAをパッケージとしてプロジェクトBに追加することができます。通常、プロジェクトBをビルドすると依存パッケージのプロジェクトAの全てがビルド対象になってしまいますが、ビルドが必要なのはプロジェクトBから参照しているモデルのみなので関係のないモデルは対象外にしたくなります。
この場合にも、YAML Selectorsが便利です。'+package:my_dbt_project_b'
のように指定して、上流のモデルのみビルド対象にできます。
selectors:
- name: my_default_selector
description: "デフォルトのセレクタです。ルートプロジェクトから依存しているモデル以外はビルド不要なため除外しています"
default: true
definition:
'+package:my_dbt_project_b' # 自プロジェクト(ルートプロジェクト)のモデルとその上流モデルのみビルド
終わりに
以上、参考になりましたら幸いです。
参考
(※真似したわけではないですが、上記の記事とほとんど同じ内容の記事になってしましました。ごめんなさい)
Discussion