🥷

デフォルトでdbtのビルド対象からモデルを除外する

2024/12/16に公開

はじめに

こんにちは、M&Aクラウドでデータエンジニアをしている つざき です。
この記事では、dbtにおいてdbt builddbt runを行うときに、デフォルトで特定のモデルを除外する方法について記載します。

dbtのモデルの中には、特定のタイミングでだけビルドすればいいようなモデルもあると思います。
普段のビルドからは毎回除外したい。でも、毎度--exclude tag:some_tagのように指定するのは面倒だったり、漏れてしまう恐れがあります。
この記事ではdbtのYAML Selectorsを使ってこの問題を解決します。

先に結論

  • YAML Selectorsを使ってデフォルトのリソースセレクタを定義する
  • selectors.ymldefault: 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-styleKey-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' # 自プロジェクト(ルートプロジェクト)のモデルとその上流モデルのみビルド

終わりに

以上、参考になりましたら幸いです。

参考

https://docs.getdbt.com/reference/node-selection/yaml-selectors

https://dev.classmethod.jp/articles/using-selectors-to-exclude-tagged-models/
(※真似したわけではないですが、上記の記事とほとんど同じ内容の記事になってしましました。ごめんなさい)

Discussion