Schemaerkennung und -zuordnung für Snowflake

In diesem Leitfaden erfahren Sie, wie Sie Ihr Schema definieren, wenn Sie Daten von Snowflake zu BigQuery übertragen. Sie können den BigQuery Data Transfer Service verwenden, um die Schema- und Datentypzuordnung automatisch zu erkennen, oder die Übersetzungs-Engine verwenden, um Ihr Schema und Ihre Datentypen manuell zu definieren.

Automatische Erkennung des Standardschemas aktivieren

Der Snowflake-Connector kann das Snowflake-Tabellenschema automatisch erkennen. Wenn Sie die automatische Schemaerkennung verwenden möchten, können Sie das Feld GCS-Pfad für Übersetzungsausgabe leer lassen, wenn Sie eine Snowflake-Übertragung einrichten.

In der folgenden Liste sehen Sie, wie der Snowflake-Connector Ihre Snowflake-Datentypen BigQuery zuordnet:

  • Die folgenden Datentypen werden in BigQuery als STRING zugeordnet:
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • Die folgenden Datentypen werden in BigQuery als TIMESTAMP zugeordnet:
    • TIMESTAMP_NTZ

Alle anderen Snowflake-Datentypen werden direkt den entsprechenden Typen in BigQuery zugeordnet.

Schema manuell mithilfe der Ausgabe der Übersetzungs-Engine definieren

Der BigQuery Data Transfer Service für den Snowflake-Connector verwendet die Übersetzungs-Engine des BigQuery-Migrationsdienstes für die Schemazuordnung, wenn Snowflake-Tabellen zu BigQuery migriert werden.

Wenn Sie Ihr Schema manuell definieren möchten (z. B. um bestimmte Schemaattribute zu überschreiben), können Sie Ihre Metadaten generieren und dann die Übersetzungs-Engine ausführen.

Beschränkungen

  • Daten werden im Parquet-Datenformat aus Snowflake extrahiert, bevor sie in BigQuery geladen werden:

    • Die folgenden Parquet-Datentypen werden nicht unterstützt:
    • Die folgenden Parquet-Datentypen werden nicht unterstützt, können aber konvertiert werden:

      • TIMESTAMP_NTZ
      • OBJECT, VARIANT, ARRAY

      Verwenden Sie die globale YAML-Konfiguration für die Typkonvertierung, um das Standardverhalten dieser Datentypen beim Ausführen der Übersetzungs-Engine zu überschreiben.

      Die YAML-Konfiguration könnte in etwa so aussehen:

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

Erforderliche Dienstkontoberechtigungen

Bei einer Snowflake-Übertragung wird ein Dienstkonto verwendet, um Daten aus der Ausgabe der Übersetzungs-Engine im angegebenen Cloud Storage-Pfad zu lesen. Sie müssen dem Dienstkonto die Berechtigungen storage.objects.get und storage.objects.list gewähren.

Wir empfehlen, dass das Dienstkonto zum selben Google Cloud -Projekt gehört, in dem die Übertragungskonfiguration und das Ziel-Dataset erstellt werden. Wenn sich das Dienstkonto in einem Google Cloud Projekt befindet, das sich von dem Projekt unterscheidet, in dem die BigQuery-Datenübertragung erstellt wurde, müssen Sie die projektübergreifende Dienstkontoautorisierung aktivieren.

Weitere Informationen finden Sie unter BigQuery-IAM-Rollen und -Berechtigungen.

Schemazuordnung manuell definieren

So definieren Sie die Schemazuordnung manuell:

  1. Führen Sie die dwh-migration-tool für Snowflake aus. Weitere Informationen finden Sie unter Metadaten für Übersetzung und Bewertung generieren.
  2. Laden Sie die generierte metadata.zip-Datei in einen Cloud Storage-Bucket hoch. Die Datei metadata.zip wird als Eingabe für die Übersetzungs-Engine verwendet.
  3. Führen Sie den Batchübersetzungsdienst aus und geben Sie im Feld target_types den Wert metadata an. Weitere Informationen finden Sie unter SQL-Abfragen mit der Translation API übersetzen.

    • Im Folgenden finden Sie ein Beispiel für einen Befehl zum Ausführen einer Batchübersetzung für 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/v2/projects/project_id/locations/location/workflows
    
    • Sie können den Status dieses Befehls in BigQuery auf der Seite SQL-Übersetzung prüfen. Die Ausgabe des Batchübersetzungsjobs wird in gs://translation_target_base_uri/metadata/config/ gespeichert.

Benutzerdefinierte Schemadatei

Wir empfehlen, ein benutzerdefiniertes Schema anzugeben, wenn Sie wichtige Informationen zu einer Tabelle erfassen müssen, z. B. den Primärschlüssel, die ansonsten bei der Migration verloren gehen würden. Wenn Sie beispielsweise eine inkrementelle Übertragung durchführen, empfehlen wir, eine benutzerdefinierte Schemadatei anzugeben, damit Daten aus nachfolgenden Übertragungen beim Laden in BigQuery ordnungsgemäß partitioniert werden können. Ohne Schemadatei können alle Informationen zu Primärschlüsseln und zur Änderungsverfolgung verloren gehen, da der BigQuery Data Transfer Service automatisch ein Tabellenschema anhand der übertragenen Quelldaten anwendet.

Benutzerdefinierte Schemas können auch hilfreich sein, wenn Sie während der Datenübertragung Spaltennamen oder Datentypen ändern müssen.

Eine benutzerdefinierte Schemadatei ist eine JSON-Datei, die Datenbankobjekte beschreibt. Das Schema enthält einen Satz von Datenbanken, die jeweils einen Satz von Tabellen enthalten, von denen jede einen Satz von Spalten enthält. Jedes Objekt hat das Feld originalName, das den Objektnamen in Snowflake angibt, und das Feld name, das den Zielnamen für das Objekt in BigQuery angibt.

Spalten enthalten die folgenden Felder:

  • originalType: gibt den Spaltendatentyp in Snowflake an.
  • type: Gibt den Zieldatentyp für die Spalte in BigQuery an.
  • usageType: Informationen darüber, wie die Spalte vom System verwendet wird. Die folgenden Nutzungstypen werden unterstützt:

    • DEFAULT: Mit diesem Nutzungstyp können Sie mehrere Spalten in einer Tabelle annotieren. Der Nutzungstyp DEFAULT gibt an, dass die Spalte im Quellsystem nicht speziell verwendet wird. Dies ist der Standardwert.
    • PRIMARY_KEY: Mit diesem Nutzungstyp können Sie Spalten in jeder Zieltabelle annotieren. Verwenden Sie den Nutzungstyp PRIMARY_KEY, um nur eine Spalte als Primärschlüssel zu identifizieren. Bei einem zusammengesetzten Schlüssel verwenden Sie denselben Nutzungstyp für mehrere Spalten, um die eindeutigen Entitäten einer Tabelle zu identifizieren. Diese Spalten werden zusammen mit COMMIT_TIMESTAMP verwendet, um Zeilen zu extrahieren, die seit der letzten Übertragungsausführung erstellt oder aktualisiert wurden.

Das folgende Beispiel zeigt eine benutzerdefinierte Schemadatei, mit der eine Snowflake-Tabelle namens orders in der Datenbank my_db übertragen, die Spalte O_ORDERKEY in ORDERKEY umbenannt und O_ORDERSTATUS als Primärschlüssel identifiziert wird.

{
  "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
            }
          ]
        }
      ]
    }
  ]
}