この記事はなに?
dbt Cloud でモデルからテーブルを生成する際に、target.name
変数を使って参照するデータセットや生成先のデータセットを動的に切り替える方法を解説した記事になります。
今回は、BigQuery に本番環境用のlake_prod
、開発環境用のlake_dev
というデータセットがあり、その中に各環境下で発生したデータが存在しているという前提のもと、各データセットから、warehouse_prod
、warehouse_dev
のデータセットに新しくテーブルを作る場合の手順をまとめております。
dbt Cloud における target について
target は、Job
及びProject の Development Credential
で設定でき、target.name
変数を宣言することで値を呼び出すことができます。
公式ヘルプ
参照するデータセットを動的に切り替えてみる
例えば、下記のようなモデルがあるとします。
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
の宣言がされていた場合は、宣言された値を参照するようにしています。
{% 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 %}
{% macro generate_schema_name(custom_schema_name, node) -%}
{{ generate_schema_name_for_env(custom_schema_name, node) }}
{%- endmacro %}
上記 macro が組まれている前提で、下記のようなdbt_project.yml
があるとします。(models 部分のみ抜粋)
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 のモデルファイルも増えていき、処理も複雑化していくため、こういった仕組みを使って最適化していきたいですね。
ここまで読んでくださりありがとうございました!