【dbt Docs】Models - Using custom schemas
Using custom schemas
What is a custom schema?
カスタムスキーマとは?
dbtはデフォルトでは、モデルは指定のスキーマに構築される。ただ、モデルを論理的に分けたい(たとえば、カテゴリとか、マート層とか)場合に、そのグループ分けに使える。
- ビジネス単位ごとにスキーマを分ける
core
,marketing
,finance
,support
など - 中間テーブルを表示せず、
analytics
といったモデルのみ見せたい場合
カスタムスキーマ
を指定することで、別に分けることができるけど、デフォルトの挙動として注意するところは、dbtが生成するスキーマネームは <target_schema>_<custom_schema>
と連結したものになる。
:::messsage
ここを<custome_schema>
とするには、Jinjaをつかったmacro
でやらないといけないらしい
※どこかで見かけた
:::
Target schema | Custom schema | DWH上のschema |
---|---|---|
<target_schema> | None | <target_schema> |
analytics | None | analytics |
dbt_alice | None | dbt_alice |
<target_schema> | <custom_schema> | <target_schema>_<custom_schema> |
analytics | marketing | analytics_marketing |
dbt_alice | marketing | dbt_alice_marketing |
How do I use custom schemas?
カスタムスキーマの設定方法
schema
を指定する。他の設定と同じく、.sql
のconfig
ブロック内 か dbt_project.yml
{{ config(schema='marketing') }}
select ...
# models in `models/marketing/ will be rendered to the "*_marketing" schema
models:
my_project:
marketing:
+schema: marketing
Understanding custom schemas
(カスタムスキーマを理解する)
Why does dbt concatenate the custom schema to the target schema?
(なぜ、dbtは、<target_schema>_<custom_schema>
とするのか?)
dbtを複数人で作る場合などに、競合してしまう場合があるのが一番の理由。
How does dbt generate a model's schema name?
(dbtはどのようにしてモデルのスキーマ名を生成するのか?)
内部的には、generate_schema_name
マクロで決定する。
{% macro generate_schema_name(custom_schema_name, node) -%}
{%- set default_schema = target.schema -%}
{%- if custom_schema_name is none -%}
{{ default_schema }}
{%- else -%}
{{ default_schema }}_{{ custom_schema_name | trim }}
{%- endif -%}
{%- endmacro %}
Advanced custom schema configuration (高度なカスタムスキーマ設定)
Changing the way dbt generates a schema name
自分のdbtプロジェクトに generate_schema_name
というmacroを作ると上書きすることができる。
An alternative pattern for generating schema names
環境(prd
, stg
, dev
といった)によってカスタムスキーマの名前を変えたい場合もある
- 本番環境
- カスタムスキーマが設定されている場合、スキーマ名はカスタムスキーマ名そのものがいい(ターゲットスキーマとカスタムスキーマ名を連結したやつじゃなくて)
- カスタムスキーマ名が設定されていない場合は、ターゲットスキーマ名
- 他の環境(
dev
など)- すべてターゲットスキーマ上に(カスタムスキーマ名は無視)
このカスタムスキーマ名を適用するためには、
- すべてターゲットスキーマ上に(カスタムスキーマ名は無視)
- put this in macros/get_custom_schema.sql
{% macro generate_schema_name(custom_schema_name, node) -%}
{{ generate_schema_name_for_env(custom_schema_name, node) }}
{%- endmacro %}
この仕組を使うためには、target
をprod
にする必要がある
generate_schema_name arguments
generate_schama_name
の引数
- custome_schema_name
- node
Jinja context available in generate_schema_name
マクロ generate_schema_name
をカスタマイズする場合に使える Jinja の記載は
- target
- env_var
- var
- exceptions
- log
- Other macros in your project
- Other macros in your package
Which vars are available in generate_schema_name?
--vars で定義された変数も使える
Managing environments
上記のgenerate_schema_nameマクロの例では、target.nameコンテキスト変数を使用して、dbtがモデル用に生成するスキーマ名を変更しています。プロジェクトのgenerate_schema_nameマクロでtarget.nameコンテキスト変数を使用する場合は、さまざまなdbt環境が適切に構成されていることをさらに確認する必要があります。任意の命名スキームを使用できますが、通常は次のことをお勧めします。
- dev : ローカル開発環
- ci : CI環境より(プルリク起動するGithubなど)
- prod : 本番環境(dbtCloudとかAirflowとか)
スキーマ名が正しく生成されていない場合は、関連する環境でターゲット名を再確認してください。
Discussion