dbt_project.ymlに出てくる+のプリフィクスは何なのか

dbtの設定ファイルにある+プリフィクスってなにもの?

はじめに

データアナリティクス事業本部のおざわです。

いろいろなプロジェクトのdbt_project.ymlを見ていると+materializedだったかと思えば、別の記事ではmaterializedだったりします。+が付いていたりいなかったり、このプリフィクスは何なのか調べてみたので共有します。

公式のドキュメントはこちらです。

結論

結論からお伝えすると、+のプリフィクスは次の2つの場合に使用します。

  1. dbtの設定とパスを区別するとき
  2. persist_docsやgrantsなど辞書型の入力を設定をするとき

1. dbtの設定とパスを区別するとき

dbtではモデルが格納されているリソースパス(フォルダ)をyamlファイルに書いておくと、配下のモデルにまとめて同じ設定を適用してくれます。下の例では、martsフォルダの配下にあるモデルの共通設定として、マテリアライズにtableを設定しています。

name: jaffle_shop  
config-version: 2

...

models:
  jaffle_shop:
    marts:
      +materialized: table

リソースパスは上のような形で指定できました。

ここでプロジェクト内のtagsフォルダをリソースパスに設定したいとします。dbtにはtagという機能があり、yamlファイル上ではtagsのキーで設定します。どちらもそのまま書いてしまうと、「設定としてのtags」なのか「パスとしてのtags」か区別が難しくなります。

こんなときに設定としてのtagsには+プリフィクスを付けて+tagsとし、リソースパスとしてのtagsは何も付けずに記載します。

name: jaffle_shop
config-version: 2

...

models:
  jaffle_shop:
    schema: my_schema
    +tags: # 設定としてのtags
      - "hello"
    tags: # リソースパスとしてのtags
      materialized: view

プリフィクスなしだとどうなるのか

試しにtagsというフォルダにモデルを作ってから、tagの設定もしてみましたが、特にエラーや警告は発生せず、tagの設定も問題なくできました。リソースパスとの区別に関しては、やっておいたほうがいいくらいの温度感なのかもしれません。ドキュメントでも「特に害はないので+のプリフィクスを付けておく」が推奨とされています。

When adding configs in dbt_project.yml, it doesn't hurt to use the + prefix, so we recommend you use it always.

2. 辞書型の入力を設定をするとき

dbtの設定には、persist_docsgrantsのようにマッピング(辞書)の入力を受け取る設定があります。これらの設定に対しては+が必要になります。

persist_docsについてはこちらのブログで紹介していますのでご確認ください。

プリフィクスなしだとどうなるか

persist_docsを以下のように+なしで設定してみました。

name: jaffle_shop
config-version: 2

...

models:
  persist_docs: 
    relation: true
    columns: true

+プリフィクスなしだとリソースパスとして読み込もうとしますが、パスが存在しないため警告が出ます。この場合はpersist_docsも有効になりませんので、descriptionは永続化されませんでした。

05:31:28  [WARNING]: Configuration paths exist in your dbt_project.yml file which do not apply to any resources.
There are 1 unused configuration paths:
- models.persist_docs

おわりに

以上、簡単ですがdbtの設定ファイルにある+プリフィクスに関して調べたことの共有でした。

参考URL