Daten nach Spanner exportieren (umgekehrte ETL)

Mit einem Workflow für Reverse Extrahieren, Transformieren und Laden (Reverse ETL) von BigQuery nach Spanner können Sie Analysefunktionen in BigQuery mit niedriger Latenz und hohem Durchsatz in Spanner kombinieren. Sie können Daten für Anwendungsnutzer bereitstellen, ohne dabei Kontingente und Limits in BigQuery aufzubrauchen.

Zum Einrichten dieses Workflows verwenden Sie die Anweisung EXPORT DATA, um Daten aus BigQuery-Datenquellen, einschließlich Iceberg-Tabellen, in eine Spanner-Tabelle zu exportieren.

Hinweis

Sie können die BigQuery-Rechenkosten reduzieren, wenn Sie einmalige Exporte nach Spanner ausführen. Legen Sie dazu eine Baseline-Slot-Kapazität von null fest und aktivieren Sie das Autoscaling.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Exportieren von BigQuery-Daten nach Spanner benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Beschränkungen

  • Diese Funktion wird in Assured Workloads nicht unterstützt.

  • Für die folgenden BigQuery-Datentypen gibt es keine Entsprechungen in Spanner und werden nicht unterstützt:

Spanner-Datenbankdialekt Nicht unterstützte BigQuery-Typen
Alle Dialekte
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC: Der unterstützte NUMERIC-Typ ist nicht breit genug. Sie können dem Typ NUMERIC in der Abfrage explizite Umwandlungen hinzufügen.
  • Die maximale Größe einer exportierten Zeile darf 1 MiB nicht überschreiten.

  • Spanner erzwingt während des Exports die referenzielle Integrität. Wenn die Zieltabelle einer anderen Tabelle untergeordnet ist (INTERLEAVE IN PARENT) oder wenn die Zieltabelle Fremdschlüsseleinschränkungen hat, werden die Fremdschlüssel und der übergeordnete Schlüssel während des Exports geprüft. Wenn eine exportierte Zeile in eine Tabelle mit INTERLEAVE IN PARENT geschrieben wird und die übergeordnete Zeile nicht vorhanden ist, schlägt der Export fehl und es wird die Meldung „Übergeordnete Zeile fehlt. Zeile kann nicht geschrieben werden“ angegeben. Wenn die exportierte Zeile in eine Tabelle mit Fremdschlüsseleinschränkungen geschrieben wird und auf einen nicht vorhandenen Schlüssel verweist, schlägt der Export mit dem Fehler „Fremdschlüsseleinschränkung verletzt“ fehl. Wenn Sie in mehrere Tabellen exportieren, sollten Sie den Export so sequenzieren, dass die referenzielle Integrität erhalten bleibt. Das bedeutet in der Regel, dass übergeordnete Tabellen und Tabellen, auf die über Fremdschlüssel verwiesen wird, vor Tabellen exportiert werden müssen, die auf diese verweisen.

    Wenn die Tabelle, die das Ziel des Exports ist, Fremdschlüsseleinschränkungen hat oder eine untergeordnete Tabelle einer anderen Tabelle ist (INTERLEAVE IN PARENT), muss die übergeordnete Tabelle vor dem Export der untergeordneten Tabelle ausgefüllt werden und alle entsprechenden Schlüssel enthalten. Wenn Sie versuchen, eine untergeordnete Tabelle zu exportieren, während eine übergeordnete Tabelle nicht alle relevanten Schlüssel enthält, schlägt der Export fehl.

  • Ein BigQuery-Job, z. B. ein Extraktionsjob in Spanner, hat eine maximale Dauer von 6 Stunden. Informationen zur Optimierung großer Extraktionsjobs finden Sie unter Exportoptimierung. Alternativ können Sie die Eingabe in einzelne Datenblöcke aufteilen, die als einzelne Extraktionsjobs exportiert werden können.

  • Exporte nach Spanner werden nur für die BigQuery Enterprise- oder Enterprise Plus-Versionen unterstützt. Die BigQuery Standard-Edition und On-Demand-Computing werden nicht unterstützt.

  • Sie können keine kontinuierlichen Abfragen verwenden, um Daten in Spanner-Tabellen mit automatisch generierten Primärschlüsseln zu exportieren.

  • Sie können keine kontinuierlichen Abfragen verwenden, um Daten in Spanner-Tabellen in einer Datenbank im PostgreSQL-Dialekt zu exportieren.

  • Wenn Sie kontinuierliche Abfragen für den Export in eine Spanner-Tabelle verwenden, achten Sie darauf, dass Sie einen Primärschlüssel auswählen, der keiner monoton steigenden Ganzzahl in Ihrer BigQuery-Tabelle entspricht. Dies kann zu Leistungsproblemen beim Export führen. Informationen zu Primärschlüsseln in Spanner und Möglichkeiten zur Behebung dieser Leistungsprobleme finden Sie unter Primärschlüssel auswählen.

Exporte mit der Option spanner_options konfigurieren

Mit der Option spanner_options können Sie eine Spanner-Zieldatenbank und -tabelle angeben. Die Konfiguration wird in Form eines JSON-Strings ausgedrückt, wie im folgenden Beispiel gezeigt:

EXPORT DATA OPTIONS(
   uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
   spanner_options = """{
      "table": "TABLE_NAME",
      "change_timestamp_column": "CHANGE_TIMESTAMP",
      "priority": "PRIORITY",
      "tag": "TAG",
   }"""
)

Ersetzen Sie Folgendes:

  • PROJECT_ID: Der Name Ihres Projekts in Google Cloud .
  • INSTANCE_ID: der Name Ihrer Datenbankinstanz
  • DATABASE_ID: der Name Ihrer Datenbank
  • TABLE_NAME: der Name einer vorhandenen Zieltabelle
  • CHANGE_TIMESTAMP: der Name der Spalte vom Typ TIMESTAMP in der Spanner-Zieltabelle. Diese Option wird beim Export verwendet, um den Zeitstempel der letzten Zeilenaktualisierung zu erfassen. Wenn diese Option angegeben ist, wird beim Export zuerst die Zeile in der Spanner-Tabelle gelesen, um sicherzustellen, dass nur die neueste Zeilenaktualisierung geschrieben wird. Wir empfehlen, eine typisierte Spalte vom Typ TIMESTAMP anzugeben, wenn Sie einen kontinuierlichen Export ausführen, bei dem die Reihenfolge der Änderungen an Zeilen mit demselben Primärschlüssel wichtig ist.
  • PRIORITY (optional): Priorität der Schreibanfragen Zulässige Werte: LOW, MEDIUM, HIGH Standardwert: MEDIUM
  • TAG (optional): Anfrage-Tag, um den Exporter-Traffic im Spanner-Monitoring zu identifizieren. Standardwert: bq_export

Anforderungen für Exportabfragen

Für den Export von Abfrageergebnissen nach Spanner müssen die Ergebnisse die folgenden Voraussetzungen erfüllen:

  • Alle Spalten in der Ergebnismenge müssen in der Zieltabelle vorhanden sein und ihre Typen müssen übereinstimmen oder konvertierbar sein.
  • Die Ergebnismenge muss alle NOT NULL-Spalten für die Zieltabelle enthalten.
  • Spaltenwerte dürfen die Spanner-Datengrößenlimits in Tabellen nicht überschreiten.
  • Nicht unterstützte Spaltentypen müssen vor dem Export in Spanner in einen der unterstützten Typen konvertiert werden.

Typkonvertierungen

Der Einfachheit halber wendet der Spanner-Exporter automatisch die folgenden Typkonvertierungen an:

BigQuery-Typ Spanner-Typ
BIGNUMERIC NUMERIC (nur PostgreSQL-Dialekt)
FLOAT64 FLOAT32
BYTES PROTO
INT64 ENUM

Daten exportieren

Mit der Anweisung EXPORT DATA können Sie Daten aus einer BigQuery-Tabelle in eine Spanner-Tabelle exportieren.

Im folgenden Beispiel werden ausgewählte Felder aus einer Tabelle mit dem Namen mydataset.table1 exportiert:

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "TABLE_NAME" }"""
)
AS SELECT * FROM mydataset.table1;

Ersetzen Sie Folgendes:

  • PROJECT_ID: Der Name Ihres Google Cloud -Projekts
  • INSTANCE_ID: der Name Ihrer Datenbankinstanz
  • DATABASE_ID: der Name Ihrer Datenbank
  • TABLE_NAME: der Name einer vorhandenen Zieltabelle

Mehrere Ergebnisse mit demselben rowkey-Wert exportieren

Wenn Sie ein Ergebnis exportieren, das mehrere Zeilen mit demselben rowkey-Wert enthält, enden die in Spanner geschriebenen Werte in derselben Spanner-Zeile. Im durch den Export erstellten Spanner-Zeilensatz ist nur eine übereinstimmende BigQuery-Zeile enthalten (es kann nicht garantiert werden, welche).

Mit einer CLOUD_RESOURCE-Verbindung exportieren

Sie können Schreibberechtigungen an eine BigQuery-CLOUD_RESOURCE-Verbindung delegieren, um Exporte auszuführen, ohne einem Nutzer direkten Zugriff auf die Spanner-Datenbank zu gewähren.

Führen Sie vor dem Exportieren nach Spanner mit einer CLOUD_RESOURCE-Verbindung die folgenden Schritte aus:

Verbindung herstellen

Sie können eine CLOUD_RESOURCE-Verbindung erstellen oder eine vorhandene verwenden, um eine Verbindung zu Spanner herzustellen.

Wählen Sie eine der folgenden Optionen aus:

Console

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Klicken Sie im linken Bereich auf Explorer:

    Hervorgehobener Button für den Explorer-Bereich.

    Wenn der linke Bereich nicht angezeigt wird, klicken Sie auf Linken Bereich maximieren, um ihn zu öffnen.

  3. Maximieren Sie im Bereich Explorer den Namen Ihres Projekts und klicken Sie dann auf Verbindungen.

  4. Klicken Sie auf der Seite Verbindungen auf Verbindung erstellen.

  5. Wählen Sie als Verbindungstyp die Option Vertex AI-Remote-Modelle, Remote-Funktionen, BigLake und Cloud Spanner (Cloud-Ressource) aus.

  6. Geben Sie im Feld Verbindungs-ID einen Namen für die Verbindung ein.

  7. Wählen Sie unter Standorttyp einen Standort für die Verbindung aus. Die Verbindung sollte sich am selben Ort wie Ihre anderen Ressourcen, z. B. Datasets, befinden.

  8. Klicken Sie auf Verbindung erstellen.

  9. Klicken Sie auf Zur Verbindung.

  10. Kopieren Sie im Bereich Verbindungsinformationen die Dienstkonto-ID zur Verwendung in einem späteren Schritt.

SQL

Verwenden Sie die Anweisung CREATE CONNECTION:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Geben Sie im Abfrageeditor die folgende Anweisung ein:

    CREATE CONNECTION [IF NOT EXISTS] `CONNECTION_NAME`
    OPTIONS (
      connection_type = "CLOUD_RESOURCE",
      friendly_name = "FRIENDLY_NAME",
      description = "DESCRIPTION"
      );

    Ersetzen Sie Folgendes:

    • CONNECTION_NAME: der Name der Verbindung im Format PROJECT_ID.LOCATION.CONNECTION_ID, LOCATION.CONNECTION_ID oder CONNECTION_ID. Wenn das Projekt oder der Standort weggelassen wird, werden sie aus dem Projekt und dem Standort abgeleitet, an dem die Anweisung ausgeführt wird.
    • FRIENDLY_NAME (optional): Ein beschreibender Name für die Verbindung.
    • DESCRIPTION (optional): Eine Beschreibung der Verbindung.

  3. Klicken Sie auf Ausführen.

Informationen zum Ausführen von Abfragen finden Sie unter Interaktive Abfrage ausführen.

bq

  1. Erstellen Sie in einer Befehlszeilenumgebung eine Verbindung:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    Der Parameter --project_id überschreibt das Standardprojekt.

    Ersetzen Sie dabei Folgendes:

    • REGION: Ihre Verbindungsregion
    • PROJECT_ID: Ihre Projekt-ID in Google Cloud
    • CONNECTION_ID: eine ID für Ihre Verbindung

    Wenn Sie eine Verbindungsressource herstellen, erstellt BigQuery ein eindeutiges Systemdienstkonto und ordnet es der Verbindung zu.

    Fehlerbehebung:Wird der folgende Verbindungsfehler angezeigt, aktualisieren Sie das Google Cloud SDK:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Rufen Sie die Dienstkonto-ID ab und kopieren Sie sie zur Verwendung in einem späteren Schritt:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    Die Ausgabe sieht etwa so aus:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Python API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import google.api_core.exceptions
from google.cloud import bigquery_connection_v1

client = bigquery_connection_v1.ConnectionServiceClient()


def create_connection(
    project_id: str,
    location: str,
    connection_id: str,
):
    """Creates a BigQuery connection to a Cloud Resource.

    Cloud Resource connection creates a service account which can then be
    granted access to other Google Cloud resources for federated queries.

    Args:
        project_id: The Google Cloud project ID.
        location: The location of the connection (for example, "us-central1").
        connection_id: The ID of the connection to create.
    """

    parent = client.common_location_path(project_id, location)

    connection = bigquery_connection_v1.Connection(
        friendly_name="Example Connection",
        description="A sample connection for a Cloud Resource.",
        cloud_resource=bigquery_connection_v1.CloudResourceProperties(),
    )

    try:
        created_connection = client.create_connection(
            parent=parent, connection_id=connection_id, connection=connection
        )
        print(f"Successfully created connection: {created_connection.name}")
        print(f"Friendly name: {created_connection.friendly_name}")
        print(
            f"Service Account: {created_connection.cloud_resource.service_account_id}"
        )

    except google.api_core.exceptions.AlreadyExists:
        print(f"Connection with ID '{connection_id}' already exists.")
        print("Please use a different connection ID.")
    except Exception as e:
        print(f"An unexpected error occurred while creating the connection: {e}")

Node.js

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Node.js API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

const {ConnectionServiceClient} =
  require('@google-cloud/bigquery-connection').v1;
const {status} = require('@grpc/grpc-js');

const client = new ConnectionServiceClient();

/**
 * Creates a new BigQuery connection to a Cloud Resource.
 *
 * A Cloud Resource connection creates a service account that can be granted access
 * to other Google Cloud resources.
 *
 * @param {string} projectId The Google Cloud project ID. for example, 'example-project-id'
 * @param {string} location The location of the project to create the connection in. for example, 'us-central1'
 * @param {string} connectionId The ID of the connection to create. for example, 'example-connection-id'
 */
async function createConnection(projectId, location, connectionId) {
  const parent = client.locationPath(projectId, location);

  const connection = {
    friendlyName: 'Example Connection',
    description: 'A sample connection for a Cloud Resource',
    // The service account for this cloudResource will be created by the API.
    // Its ID will be available in the response.
    cloudResource: {},
  };

  const request = {
    parent,
    connectionId,
    connection,
  };

  try {
    const [response] = await client.createConnection(request);

    console.log(`Successfully created connection: ${response.name}`);
    console.log(`Friendly name: ${response.friendlyName}`);

    console.log(`Service Account: ${response.cloudResource.serviceAccountId}`);
  } catch (err) {
    if (err.code === status.ALREADY_EXISTS) {
      console.log(`Connection '${connectionId}' already exists.`);
    } else {
      console.error(`Error creating connection: ${err.message}`);
    }
  }
}

Terraform

Verwenden Sie die Ressource google_bigquery_connection:

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Im folgenden Beispiel wird eine Cloud-Ressourcenverbindung mit dem Namen my_cloud_resource_connection in der Region US erstellt:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre Terraform-Konfiguration auf ein Google Cloud -Projekt anzuwenden.

Cloud Shell vorbereiten

  1. Rufen Sie Cloud Shell auf.
  2. Legen Sie das Google Cloud -Standardprojekt fest, auf das Sie Ihre Terraform-Konfigurationen anwenden möchten.

    Sie müssen diesen Befehl nur einmal pro Projekt und in jedem beliebigen Verzeichnis ausführen.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Umgebungsvariablen werden überschrieben, wenn Sie in der Terraform-Konfigurationsdatei explizite Werte festlegen.

Verzeichnis vorbereiten

Jede Terraform-Konfigurationsdatei muss ein eigenes Verzeichnis haben (auch als Stammmodul bezeichnet).

  1. Erstellen Sie in Cloud Shell ein Verzeichnis und eine neue Datei in diesem Verzeichnis. Der Dateiname muss die Erweiterung .tf haben, z. B. main.tf. In dieser Anleitung wird die Datei als main.tf bezeichnet.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Wenn Sie einer Anleitung folgen, können Sie den Beispielcode in jedem Abschnitt oder Schritt kopieren.

    Kopieren Sie den Beispielcode in das neu erstellte main.tf.

    Kopieren Sie optional den Code aus GitHub. Dies wird empfohlen, wenn das Terraform-Snippet Teil einer End-to-End-Lösung ist.

  3. Prüfen und ändern Sie die Beispielparameter, die auf Ihre Umgebung angewendet werden sollen.
  4. Speichern Sie die Änderungen.
  5. Initialisieren Sie Terraform. Dies ist nur einmal für jedes Verzeichnis erforderlich.
    terraform init

    Fügen Sie optional die Option -upgrade ein, um die neueste Google-Anbieterversion zu verwenden:

    terraform init -upgrade

Änderungen anwenden

  1. Prüfen Sie die Konfiguration und prüfen Sie, ob die Ressourcen, die Terraform erstellen oder aktualisieren wird, Ihren Erwartungen entsprechen:
    terraform plan

    Korrigieren Sie die Konfiguration nach Bedarf.

  2. Wenden Sie die Terraform-Konfiguration an. Führen Sie dazu den folgenden Befehl aus und geben Sie yes an der Eingabeaufforderung ein:
    terraform apply

    Warten Sie, bis Terraform die Meldung „Apply complete“ anzeigt.

  3. Öffnen Sie Ihr Google Cloud -Projekt, um die Ergebnisse aufzurufen. Rufen Sie in der Google Cloud Console Ihre Ressourcen in der Benutzeroberfläche auf, um sicherzustellen, dass Terraform sie erstellt oder aktualisiert hat.

Öffnen Sie die Verbindung, nachdem Sie sie erstellt haben. Kopieren Sie im Bereich Verbindungsinformationen die Dienstkonto-ID. Sie benötigen diese ID, wenn Sie Berechtigungen für die Verbindung konfigurieren. Wenn Sie eine Verbindungsressource herstellen, erstellt BigQuery ein eindeutiges Systemdienstkonto und ordnet es der Verbindung zu.

Zugriff einrichten

Sie müssen dem Dienstkonto, das mit der neuen Verbindung verknüpft ist, Schreibzugriff auf Ihre Spanner-Instanz oder -Datenbank gewähren. Wir empfehlen, die vordefinierte IAM-Rolle Cloud Spanner-Datenbanknutzer (roles/spanner.databaseUser) zu verwenden. Für diese Schritte ist die Dienstkonto-ID erforderlich, die Sie beim Erstellen der Verbindung kopiert haben.

So gewähren Sie dem Dienstkonto Zugriff auf Rollen auf Datenbankebene:

  1. Rufen Sie die Seite „Spanner-Instanzen“ auf.

    Zur Seite "Instanzen"

  2. Klicken Sie auf den Namen der Instanz, die die Datenbank enthält.

  3. Klicken Sie auf dem Tab Übersicht auf das Kästchen Ihrer Datenbank.

  4. Das Dialogfeld Infofeld wird angezeigt. Klicken Sie auf Hauptkonto hinzufügen.

  5. Geben Sie unter Neue Hauptkonten die Dienstkonto-ID ein, die Sie zuvor kopiert haben.

  6. Wählen Sie im Feld Rolle auswählen eine Rolle mit spanner.databases.write-Berechtigungen aus. Wir empfehlen die Verwendung der Rolle Cloud Spanner-Datenbanknutzer.

  7. Klicken Sie auf Speichern.

Export mit der Verbindung CLOUD_RESOURCE ausführen

Nachdem die Verbindung erstellt und der entsprechende Zugriff gewährt wurde, können Sie den Export über die CLOUD_RESOURCE-Verbindung ausführen. Im folgenden Beispiel wird ein EXPORT-Befehl gezeigt, der mit einer CLOUD_RESOURCE-Verbindung exportiert.

EXPORT DATA WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME` OPTIONS (
  uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "SPANNER_TABLE_NAME" }"""
)
AS SELECT * FROM my_bq_dataset.table1;

Ersetzen Sie Folgendes:

  • PROJECT_ID: Der Name Ihres Projekts in Google Cloud .
  • LOCATION: der Standort, an dem Sie die Verbindung erstellt haben, z. B. us.
  • CONNECTION_NAME: der Name der Verbindung, die zum Ausführen des Exports verwendet wird, z. B. myconnection.
  • INSTANCE_ID: der Name Ihrer Spanner-Datenbankinstanz.
  • DATABASE_ID: der Name Ihrer Spanner-Datenbank.
  • SPANNER_TABLE_NAME: Der Name der vorhandenen Spanner-Zieltabelle.

Kontinuierlich exportieren

Wenn Sie eine Exportabfrage kontinuierlich verarbeiten möchten, finden Sie unter Kontinuierliche Abfragen erstellen eine Anleitung und Beispielcode.

Exportoptimierung

Versuchen Sie Folgendes, um den Export von Datensätzen von BigQuery nach Spanner zu optimieren:

  • Anzahl der Knoten in der Spanner-Zielinstanz erhöhen In den frühen Phasen des Exports führt die Erhöhung der Anzahl der Knoten in der Instanz möglicherweise nicht sofort zu einer Steigerung des Exportdurchsatzes. Es kann zu einer leichten Verzögerung kommen, da Spanner eine lastbasierte Aufteilung durchführt. Bei der lastbasierten Aufteilung steigt der Exportdurchsatz an und stabilisiert sich. Mit der Anweisung EXPORT DATA werden Daten in Batches zusammengefasst, um Schreibvorgänge in Spanner zu optimieren. Weitere Informationen finden Sie unter Leistungsübersicht.

  • Geben Sie die Priorität HIGH in spanner_options an. Wenn für Ihre Spanner-Instanz Autoscaling aktiviert ist, sorgt die Priorität HIGH dafür, dass die CPU-Auslastung den erforderlichen Schwellenwert erreicht, um die Skalierung auszulösen. Dadurch kann das Autoscaling als Reaktion auf die Exportlast Rechenressourcen hinzufügen, was den Gesamtexportdurchsatz verbessern kann.

    Das folgende Beispiel zeigt einen Spanner-Exportbefehl mit der Priorität HIGH:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "TABLE_NAME", "priority": "LOW" }"""
    )
  • Vermeiden Sie die Sortierung der Abfrageergebnisse. Wenn die Ergebnismenge alle Primärschlüsselspalten enthält, sortiert der Exporter die Primärschlüssel der Zieltabelle automatisch, um Schreibvorgänge zu optimieren und Konflikte zu minimieren.

    Wenn der Primärschlüssel der Zieltabelle generierte Spalten enthält, fügen Sie die Ausdrücke der generierten Spalten der Abfrage hinzu, damit die exportierten Daten korrekt sortiert und im Batch verarbeitet werden.

    Im folgenden Spanner-Schema sind SaleYear und SaleMonth beispielsweise generierte Spalten, die den Anfang des Spanner-Primärschlüssels bilden:

    CREATE TABLE Sales (
      SaleId STRING(36) NOT NULL,
      ProductId INT64 NOT NULL,
      SaleTimestamp TIMESTAMP NOT NULL,
      Amount FLOAT64,
      -- Generated columns
      SaleYear INT64 AS (EXTRACT(YEAR FROM SaleTimestamp)) STORED,
      SaleMonth INT64 AS (EXTRACT(MONTH FROM SaleTimestamp)) STORED,
    ) PRIMARY KEY (SaleYear, SaleMonth, SaleId);

    Wenn Sie Daten aus BigQuery in eine Spanner-Tabelle mit generierten Spalten exportieren, die im Primärschlüssel verwendet werden, wird empfohlen, aber nicht vorgeschrieben, die Ausdrücke für diese generierten Spalten in Ihre EXPORT DATA-Abfrage aufzunehmen. So kann BigQuery die Daten korrekt vorsortieren, was für ein effizientes Batching und Schreiben in Cloud Spanner entscheidend ist. Die Werte für die generierten Spalten in der EXPORT DATA-Anweisung werden in Spanner nicht übernommen, da sie von Spanner automatisch generiert werden. Sie werden jedoch zur Optimierung des Exports verwendet.

    Im folgenden Beispiel werden Daten in eine Spanner-Sales-Tabelle exportiert, deren Primärschlüssel generierte Spalten verwendet. Zur Optimierung der Schreibleistung enthält die Abfrage EXTRACT-Ausdrücke, die mit den generierten Spalten SaleYear und SaleMonth übereinstimmen. So kann BigQuery die Daten vor dem Export vorsortieren:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "Sales" }"""
    )
    AS SELECT
      s.SaleId,
      s.ProductId,
      s.SaleTimestamp,
      s.Amount,
      -- Add expressions that match the generated columns in the Spanner PK
      EXTRACT(YEAR FROM s.SaleTimestamp) AS SaleYear,
      EXTRACT(MONTH FROM s.SaleTimestamp) AS SaleMonth
    FROM my_dataset.sales_export AS s;
  • Um langwierige Jobs zu vermeiden, exportieren Sie Daten nach Partition. Fragmentieren Sie Ihre BigQuery-Daten mit einem Partitionsschlüssel, z. B. einem Zeitstempel in Ihrer Abfrage:

    EXPORT DATA OPTIONS (
      uri="https://spanner.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID",
      format='CLOUD_SPANNER',
      spanner_options="""{ "table": "TABLE_NAME", "priority": "MEDIUM" }"""
    )
    AS SELECT *
    FROM 'mydataset.table1' d
    WHERE
    d.timestamp >= TIMESTAMP '2025-08-28T00:00:00Z' AND
    d.timestamp < TIMESTAMP '2025-08-29T00:00:00Z';

    So kann die Abfrage innerhalb der 6-stündigen Joblaufzeit abgeschlossen werden. Weitere Informationen zu diesen Limits finden Sie unter Limits für Abfragejobs.

  • Löschen Sie den Index in der Cloud Spanner-Tabelle, in die Daten importiert werden, um die Leistung beim Laden von Daten zu verbessern. Erstellen Sie ihn dann nach Abschluss des Imports neu.

  • Wir empfehlen, mit einem Spanner-Knoten (1.000 Verarbeitungseinheiten) und einer minimalen BigQuery-Slot-Reservierung zu beginnen. Beispiel: 100 Slots oder 0 Referenz-Slots mit Autoscaling. Bei Exporten unter 100 GB wird diese Konfiguration normalerweise innerhalb des 6-Stunden-Joblimits abgeschlossen. Erhöhen Sie bei Exporten mit mehr als 100 GB den Durchsatz, indem Sie die Spanner-Knoten und BigQuery-Slot-Reservierungen nach Bedarf hochskalieren. Der Durchsatz skaliert mit etwa 5 MiB/s pro Knoten.

Preise

Wenn Sie Daten mit der Anweisung EXPORT DATA nach Spanner exportieren, werden Ihnen die Kosten gemäß den BigQuery-Kapazitätsrechenpreisen in Rechnung gestellt.

Wenn Sie Daten mithilfe einer kontinuierlichen Abfrage kontinuierlich nach Spanner exportieren möchten, benötigen Sie eine Slot-Reservierung für die BigQuery Enterprise- oder Enterprise Plus-Version und eine Reservierungszuweisung mit dem Jobtyp CONTINUOUS.

Für BigQuery-Exporte nach Cloud Spanner, die über regionale Grenzen hinweg erfolgen, werden Datenextraktionsraten berechnet. Weitere Informationen finden Sie unter BigQuery-Preise. Um Gebühren für die Datenübertragung zu vermeiden, muss der BigQuery-Export in derselben Region wie der Standard-Leader von Spanner ausgeführt werden.

Nachdem die Daten exportiert wurden, wird das Speichern der Daten in Spanner in Rechnung gestellt. Weitere Informationen finden Sie unter Spanner-Preise.