Snowflake のスキーマの検出とマッピング

このガイドでは、Snowflake から BigQuery にデータを転送するときにスキーマを定義する方法について説明します。BigQuery Data Transfer Service を使用してスキーマとデータ型のマッピングを自動的に検出することも、変換エンジンを使用してスキーマとデータ型を手動で定義することもできます。

デフォルトのスキーマの自動検出を有効にする

Snowflake コネクタは、Snowflake テーブル スキーマを自動的に検出できます。スキーマの自動検出を使用するには、Snowflake の転送を設定するときに、[Translation output GCS path] フィールドを空白のままにします。

次のリストは、Snowflake コネクタが Snowflake データ型を BigQuery にマッピングする方法を示しています。

  • 次のデータ型は、BigQuery で STRING としてマッピングされます。
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • 次のデータ型は、BigQuery で TIMESTAMP としてマッピングされます。
    • TIMESTAMP_NTZ

他のすべての Snowflake データ型は、BigQuery の同等の型に直接マッピングされます。

変換エンジンの出力を使用してスキーマを手動で定義する

BigQuery Data Transfer Service for Snowflake コネクタは、Snowflake テーブルを BigQuery に移行するときに、BigQuery 移行サービス変換エンジンをスキーマ マッピングに使用します。

スキーマを手動で定義する(特定のスキーマ属性をオーバーライドするなど)には、メタデータを生成してから変換エンジンを実行します。

制限事項

  • データは、BigQuery に読み込まれる前に、Parquet データ形式で Snowflake から抽出されます。

    • 次の Parquet データ型はサポートされていません。
    • 次の Parquet データ型はサポートされていませんが、変換できます。

      • TIMESTAMP_NTZ
      • OBJECTVARIANTARRAY

      グローバル型変換構成 YAML を使用して、変換エンジンを実行するときに、これらのデータ型のデフォルトの動作をオーバーライドします。

      構成 YAML は次の例のようになります。

      type: experimental_object_rewriter
      global:
        typeConvert:
          datetime: TIMESTAMP
          json: VARCHAR
      

サービス アカウントに必要な権限

Snowflake 転送では、サービス アカウントを使用して、指定された Cloud Storage パスの変換エンジン出力からデータを読み取ります。サービス アカウントに storage.objects.get 権限と storage.objects.list 権限を付与する必要があります。

転送構成と宛先データセットが作成される Google Cloud プロジェクトに属しているサービス アカウントを使用することをおすすめします。サービス アカウントが BigQuery データ転送を作成したプロジェクトとは異なる Google Cloud プロジェクトのサービス アカウントである場合は、プロジェクト間のサービス アカウントの承認を有効にする必要があります。

詳細については、BigQuery の IAM ロールと権限をご覧ください。

スキーマ マッピングを手動で定義する

次の手順でスキーマ マッピングを手動で定義できます。

  1. Snowflake 用の dwh-migration-tool を実行します。詳細については、変換と評価のためのメタデータを生成するをご覧ください。
  2. 生成された metadata.zip ファイルを Cloud Storage バケットにアップロードします。metadata.zip ファイルは、変換エンジンの入力として使用されます。
  3. target_types フィールドを metadata として指定して、バッチ変換サービスを実行します。詳細については、Translation API を使用して SQL クエリを 変換するをご覧ください。

    • Snowflake のバッチ変換を実行するコマンドの例を次に示します。
      curl -d "{
      \"name\": \"sf_2_bq_translation\",
      \"displayName\": \"Snowflake to BigQuery Translation\",
      \"tasks\": {
          string: {
            \"type\": \"Snowflake2BigQuery_Translation\",
            \"translation_details\": {
                \"target_base_uri\": \"gs://sf_test_translation/output\",
                \"source_target_mapping\": {
                  \"source_spec\": {
                      \"base_uri\": \"gs://sf_test_translation/input\"
                  }
                },
                \"target_types\": \"metadata\",
            }
          }
      },
      }" \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/project_id/locations/location/workflows
    
    • このコマンドのステータスは、BigQuery の SQL 変換ページで確認できます。 バッチ変換ジョブの出力は gs://translation_target_base_uri/metadata/config/ に保存されます。

カスタム スキーマ ファイル

移行時に失われる可能性がある、テーブルに関する重要な情報(主キーなど)をキャプチャする必要がある場合は、カスタム スキーマを指定することをおすすめします。たとえば、増分転送を行う場合は、後続の転送からのデータを BigQuery に読み込むときに 適切に分割できるように、カスタム スキーマ ファイルを指定することをおすすめします。スキーマ ファイルがない場合、BigQuery Data Transfer Service は転送されるソースデータを使用してテーブル スキーマを自動的に適用するため、主キーと変更トラッキングに関するすべての情報が失われる可能性があります。

データ転送中に列名またはデータ型を変更する必要がある場合にも、カスタム スキーマが役立ちます。

スキーマ ファイルは、データベース オブジェクトを記述する JSON ファイルです。スキーマには、一連のデータベースが含まれ、各データベースに一連のテーブルが含まれます。各テーブルには、一連の列が含まれます。各オブジェクトには、Snowflake のオブジェクト名を示す originalName フィールドと、BigQuery のオブジェクトのターゲット名を示す name フィールドがあります。

列には次のフィールドがあります。

  • originalType: Snowflake の列のデータ型を示します。
  • type: BigQuery での列のターゲット データタイプを示します。
  • usageType: システムでの列の使用方法に関する情報。次の使用タイプがサポートされています。

    • DEFAULT: この使用タイプでは、1 つのターゲット テーブルの複数の列にアノテーションを付けることができます。DEFAULT 使用タイプは、その列がソースシステムで特別な用途を持たないことを示します。これはデフォルト値です。
    • PRIMARY_KEY: この使用タイプでは、各ターゲット テーブルの列にアノテーションを付けることができます。PRIMARY_KEY 使用タイプを使用して、1 つの列のみを主キーとして識別します。複合キーの場合は、複数の列に同じ使用タイプを使用して、テーブルの一意のエンティティを識別します。これらの列は COMMIT_TIMESTAMP と連携して、前回の転送実行以降に作成または更新された行を抽出します。

次の例は、my_db データベースの orders という Snowflake テーブルを転送し、O_ORDERKEY 列の名前を ORDERKEY に変更し、O_ORDERSTATUS を主キーとして識別するカスタム スキーマ ファイルを示しています。

{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "ORDERKEY",
              "originalName": "O_ORDERKEY",
              "type": "INT64",
              "originalType": "NUMERIC",
              "usageType": [
                "PRIMARY_KEY"
              ],
              "isRequired": true,
              "originalColumnLength": 4
            },
            {
              "name": "O_ORDERSTATUS",
              "originalName": "O_ORDERSTATUS",
              "type": "STRING",
              "originalType": "VARCHAR",
              "usageType": [
                "DEFAULT"
              ],
              "isRequired": true,
              "originalColumnLength": 1
            }
          ]
        }
      ]
    }
  ]
}