2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【dbt Cloud】target.name 変数を使って動的にモデルを処理してみる

Posted at

この記事はなに?

dbt Cloud でモデルからテーブルを生成する際に、target.name変数を使って参照するデータセットや生成先のデータセットを動的に切り替える方法を解説した記事になります。

今回は、BigQuery に本番環境用のlake_prod、開発環境用のlake_devというデータセットがあり、その中に各環境下で発生したデータが存在しているという前提のもと、各データセットから、warehouse_prodwarehouse_devのデータセットに新しくテーブルを作る場合の手順をまとめております。

dbt Cloud における target について

target は、Job及びProject の Development Credentialで設定でき、target.name変数を宣言することで値を呼び出すことができます。
公式ヘルプ

参照するデータセットを動的に切り替えてみる

例えば、下記のようなモデルがあるとします。

sample_model.sql
SELECT
  id
  , name
FROM
  `sample_project.lake_{{target.name}}.sample_table`

データセットの宣言部分にtarget.name変数を入れているため、target に prod という文字列が設定された Job でdbt runコマンドを実行した場合、FROM 句の部分はsample_project.lake_prod.sample_tableという文字列になります。

同様に、他の Job で target に devという文字列を設定してdbt runを実行した場合は、sample_project.lake_dev.sample_tableという文字列になります。

このようにtarget.nameをモデル内で宣言することで、同じようなモデルを量産せずに1つのモデルで動的に処理を切り替えることができます。

生成先のデータセットを動的に切り替えてみる

前提として、こちらの記事を参考に、下記 macro を実装し、dbt_project.yml内でschemaの宣言がされていた場合は、宣言された値を参照するようにしています。

generate_schema_name_for_env.sql
{% macro generate_schema_name_for_env(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}
    {%- if (target.name == 'prod' or target.name == 'dev') and custom_schema_name is not none -%}

        {{ custom_schema_name | trim }}

    {%- else -%}

        {{ default_schema }}

    {%- endif -%}

{%- endmacro %}
get_custom_schema.sql
{% macro generate_schema_name(custom_schema_name, node) -%}
  {{ generate_schema_name_for_env(custom_schema_name, node) }}
{%- endmacro %}

上記 macro が組まれている前提で、下記のようなdbt_project.ymlがあるとします。(models 部分のみ抜粋)

dbt_project.yml
models:
  project_name:
    warehouses:
      +materialized: table
      +schema: |
        {%- if  target.name == "prod" -%} warehouse_prod
        {%- elif target.name == "dev"  -%} warehouse_dev
        {%- else -%} invalid_database
        {%- endif -%}

Jinja の if ステートメントを用いてtarget.nameの値を比較することで、動的に schema が参照する文字列を切り替えています。

これにより、lake_prodのデータはwarehouse_prodに、lake_devのデータはwarehouse_devにテーブルを生成させることができます。

おわりに

今回の動作検証を通して、dbt Cloud における target の役割を理解することができました。
扱うデータが増えれば増えるほど、dbt のモデルファイルも増えていき、処理も複雑化していくため、こういった仕組みを使って最適化していきたいですね。
ここまで読んでくださりありがとうございました!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?