複数のスキーマからデータを取り込むデータ パイプラインを構築しています。jinja を使用してスキーマ名のリストを取り込み、データを 1 つのステージング テーブルに結合する前に、これらすべてのスキーマで (同じ名前の) テーブル内の特定の列をクエリしようとしています。
概念レベルでは、Jinja を使用して 2 つのリストを作成する必要があることはわかっています。1 つはschemaループする名前のリスト、もう 1 つはすべてのスキーマに存在するテーブルで照会する列名のリストです。問い合わせています。schema_namesスキーマ名のリストと列名のリストを呼び出しましょうcolumn_names。
{% set var schema_names=('brand1', 'brand2', 'brand3') %}{% set var column_names=('col1', 'col2', 'col3') %}
理論的には、次のステップは、Jinja を介してこれらの値をクエリに渡し、スキーマ内のテーブルから同じ列のリストを選択することschema_varsです。SQL クエリを手動で記述するとしたら、いくつかのWITHステートメントを使用し、それらを次のように組み合わせて使用しUNION ALLます。
/* Query that creates a variable with value `brand1` while querying `brand1` schema */
WITH schema1_data
AS (
SELECT 'brand1' AS schema_name,
col1,
col2,
col3
FROM brand1.table_name
),
/* Query that creates a variable with value `brand2` while querying `brand2` schema */
schema2_data
AS (
SELECT 'brand2' AS schema_name,
col1,
col2,
col3
FROM brand2.table_name
),
/* Query that creates a variable with value `brand3` while querying `brand3` schema */
schema3_data
AS (
SELECT 'brand3' AS schema_name,
col1,
col2,
col3
FROM brand3.table_name
),
/* Union statement combining identical tables from 3 schemas */
combined_schemas
AS (
SELECT *
FROM schema1_data
UNION ALL
(
SELECT *
FROM schema2_data)
UNION ALL
(
SELECT *
FROM schema3_data)
)
SELECT *
FROM combined_schemas
これを Jinja/dbt でどのように実装するのが最適かについての考えはありますか? また、データ パイプラインによって処理される単一のステージング テーブルに、異なるスキーマ内の同一のテーブルからの情報を結合するために異なるアプローチを取る、問題の代替フレーミングにも開かれています。