複数のスキーマからデータを取り込むデータ パイプラインを構築しています。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 でどのように実装するのが最適かについての考えはありますか? また、データ パイプラインによって処理される単一のステージング テーブルに、異なるスキーマ内の同一のテーブルからの情報を結合するために異なるアプローチを取る、問題の代替フレーミングにも開かれています。