1

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

4

1 に答える 1