🐈

【dbt Docs】Models - Using custom schemas

2022/03/11に公開

Using custom schemas

https://docs.getdbt.com/docs/building-a-dbt-project/building-models/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を指定する。他の設定と同じく、.sqlconfigブロック内 か dbt_project.yml

orders.sql
{{ config(schema='marketing') }}
select ...
dbt_project.yml
# 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など)
    • すべてターゲットスキーマ上に(カスタムスキーマ名は無視)
      このカスタムスキーマ名を適用するためには、
macros/get_custom_schema.sql
- 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 %}

この仕組を使うためには、targetprodにする必要がある

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