Esporta i dati in Spanner (ETL inverso)

Questo documento descrive come configurare un flusso di lavoro di estrazione, trasformazione e caricamento inverso (ETL inverso) da BigQuery a Spanner. Puoi farlo utilizzando l'istruzione EXPORT DATA per esportare i dati dalle origini dati BigQuery, incluse le tabelle Iceberg, in una tabella Spanner.

Questo workflow ETL inverso combina le funzionalità di analisi di BigQuery con la bassa latenza e il throughput elevato di Spanner. Questo workflow ti consente di fornire dati agli utenti dell'applicazione senza esaurire le quote e i limiti di BigQuery.

Prima di iniziare

Puoi ridurre i costi di calcolo di BigQuery quando esegui esportazioni una tantum in Spanner impostando una capacità slot di base pari a zero e attivando la scalabilità automatica.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per esportare i dati di BigQuery in Spanner, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Limitazioni

  • Questa funzionalità non è supportata in Assured Workloads.

  • I seguenti tipi di dati BigQuery non hanno equivalenti in Spanner e non sono supportati:

Dialetto del database Spanner Tipi di BigQuery non supportati
Tutti i dialetti
  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME
GoogleSQL
  • BIGNUMERIC: il tipo NUMERIC supportato non è abbastanza ampio. Valuta la possibilità di aggiungere cast espliciti al tipo NUMERIC nella query.
  • La dimensione massima di una riga esportata non può superare 1 MiB.

  • Spanner applica l'integrità referenziale durante l'esportazione. Se la tabella di destinazione è un elemento secondario di un'altra tabella (INTERLEAVE IN PARENT) o se la tabella di destinazione ha vincoli di chiave esterna, le chiavi esterne e la chiave principale verranno convalidate durante l'esportazione. Se una riga esportata viene scritta in una tabella con INTERLEAVE IN PARENT e la riga padre non esiste, l'esportazione non andrà a buon fine e verrà visualizzato il messaggio "Parent row is missing. Impossibile scrivere la riga". Se la riga esportata viene scritta in una tabella con vincoli di chiave esterna e fa riferimento a una chiave che non esiste, l'esportazione non riuscirà e verrà visualizzato l'errore "Violazione del vincolo di chiave esterna". Quando esporti in più tabelle, ti consigliamo di sequenziare l'esportazione per garantire che l'integrità referenziale venga mantenuta durante l'esportazione. In genere, ciò significa esportare le tabelle principali e le tabelle a cui fanno riferimento le chiavi esterne prima delle tabelle che fanno riferimento a queste ultime.

    Se la tabella di destinazione dell'esportazione ha vincoli di chiave esterna o è figlia di un'altra tabella (INTERLEAVE IN PARENT), la tabella padre deve essere compilata prima dell'esportazione di una tabella figlia e deve contenere tutte le chiavi corrispondenti. Un tentativo di esportare una tabella secondaria mentre una tabella principale non dispone dell'insieme completo di chiavi pertinenti non andrà a buon fine.

  • Un job BigQuery, ad esempio un job di estrazione in Spanner, ha una durata massima di 6 ore. Per informazioni sull'ottimizzazione di job di estrazione di grandi dimensioni, consulta Ottimizzazione dell'esportazione. In alternativa, valuta la possibilità di suddividere l'input in singoli blocchi di dati, che possono essere esportati come singoli job di estrazione.

  • Le esportazioni in Spanner sono supportate solo per le versioni BigQuery Enterprise o Enterprise Plus. La versione BigQuery Standard e il calcolo on demand non sono supportati.

  • Non puoi utilizzare le query continue per esportare in tabelle Spanner con chiavi primarie generate automaticamente.

  • Non puoi utilizzare le query continue per esportare in tabelle Spanner in un database con dialetto PostgreSQL.

  • Quando utilizzi le query continue per l'esportazione in una tabella Spanner, assicurati di scegliere una chiave primaria che non corrisponda a un numero intero monotonicamente crescente nella tabella BigQuery. In caso contrario, potrebbero verificarsi problemi di prestazioni nell'esportazione. Per informazioni sulle chiavi primarie in Spanner e sui modi per mitigare questi problemi di prestazioni, consulta Scegli una chiave primaria.

Configura le esportazioni con l'opzione spanner_options

Puoi utilizzare l'opzione spanner_options per specificare un database e una tabella Spanner di destinazione. La configurazione è espressa sotto forma di stringa JSON, come mostrato nell'esempio seguente:

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",
   }"""
)

Sostituisci quanto segue:

  • PROJECT_ID: il nome del progetto Google Cloud .
  • INSTANCE_ID: il nome dell'istanza di database.
  • DATABASE_ID: il nome del database.
  • TABLE_NAME: il nome di una tabella di destinazione esistente.
  • CHANGE_TIMESTAMP: il nome della colonna tipizzata TIMESTAMP nella tabella Spanner di destinazione. Questa opzione viene utilizzata durante l'esportazione per monitorare il timestamp dell'aggiornamento più recente della riga. Quando questa opzione è specificata, l'esportazione esegue prima una lettura della riga nella tabella Spanner per assicurarsi che venga scritto solo l'ultimo aggiornamento della riga. Ti consigliamo di specificare una colonna tipizzata TIMESTAMP quando esegui un'esportazione continua, in cui l'ordine delle modifiche alle righe con la stessa chiave primaria è importante.
  • PRIORITY (facoltativo): priorità delle richieste di scrittura. Valori consentiti: LOW, MEDIUM, HIGH. Valore predefinito: MEDIUM.
  • TAG (facoltativo): tag di richiesta per identificare il traffico dell'esportatore nel monitoraggio di Spanner. Valore predefinito: bq_export.

Requisiti per la query di esportazione

Per esportare i risultati delle query in Spanner, i risultati devono soddisfare i seguenti requisiti:

  • Tutte le colonne nel set di risultati devono esistere nella tabella di destinazione e i relativi tipi devono corrispondere o essere convertibili.
  • Il set di risultati deve contenere tutte le colonne NOT NULL per la tabella di destinazione.
  • I valori delle colonne non devono superare i limiti di dimensione dei dati di Spanner all'interno delle tabelle.
  • Tutti i tipi di colonna non supportati devono essere convertiti in uno dei tipi supportati prima dell'esportazione in Spanner.

Conversioni di tipo

Per facilità d'uso, l'esportatore Spanner applica automaticamente le seguenti conversioni di tipo:

Tipo BigQuery Tipo di Spanner
BIGNUMERIC NUMERIC (solo dialetto PostgreSQL)
FLOAT64 FLOAT32
BYTES PROTO
INT64 ENUM

Esporta i dati

Puoi utilizzare l'istruzione EXPORT DATA per esportare i dati da una tabella BigQuery in una tabella Spanner.

L'esempio seguente esporta i campi selezionati da una tabella denominata mydataset.table1:

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;

Sostituisci quanto segue:

  • PROJECT_ID: il nome del progetto Google Cloud
  • INSTANCE_ID: il nome dell'istanza di database
  • DATABASE_ID: il nome del database
  • TABLE_NAME: il nome di una tabella di destinazione esistente

Esporta più risultati con lo stesso valore rowkey

Quando esporti un risultato contenente più righe con lo stesso valore rowkey, i valori scritti in Spanner finiscono nella stessa riga di Spanner. Solo una singola riga BigQuery corrispondente (non è garantito quale) sarà presente nel set di righe Spanner prodotto dall'esportazione.

Esporta utilizzando una connessione CLOUD_RESOURCE

Puoi delegare le autorizzazioni in scrittura a una connessione BigQuery CLOUD_RESOURCE per eseguire le esportazioni senza concedere a un utente l'accesso diretto al database Spanner.

Prima di esportare in Spanner con una connessione CLOUD_RESOURCE, segui questi passaggi:

Crea una connessione

Puoi creare o utilizzare una connessione CLOUD_RESOURCE esistente per connetterti a Spanner.

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro a sinistra, fai clic su Explorer:

    Pulsante evidenziato per il riquadro Spazio di esplorazione.

    Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro sinistro per aprirlo.

  3. Nel riquadro Explorer, espandi il nome del progetto, quindi fai clic su Connessioni.

  4. Nella pagina Connessioni, fai clic su Crea connessione.

  5. In Tipo di connessione, scegli Modelli remoti di Vertex AI, funzioni remote, BigLake e Spanner (risorsa Cloud).

  6. Nel campo ID connessione, inserisci un nome per la connessione.

  7. In Tipo di località, seleziona una località per la connessione. La connessione deve essere collocata insieme alle altre risorse, ad esempio i set di dati.

  8. Fai clic su Crea connessione.

  9. Fai clic su Vai alla connessione.

  10. Nel riquadro Informazioni sulla connessione, copia l'ID account di servizio da utilizzare in un passaggio successivo.

SQL

Utilizza l'istruzione CREATE CONNECTION:

  1. Nella console Google Cloud , vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

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

    Sostituisci quanto segue:

    • CONNECTION_NAME: il nome della connessione nel formato PROJECT_ID.LOCATION.CONNECTION_ID, LOCATION.CONNECTION_ID o CONNECTION_ID. Se il progetto o la località vengono omessi, vengono dedotti dal progetto e dalla località in cui viene eseguita l'istruzione.
    • FRIENDLY_NAME (facoltativo): un nome descrittivo per la connessione.
    • DESCRIPTION (facoltativo): una descrizione della connessione.

  3. Fai clic su Esegui.

Per saperne di più su come eseguire le query, consulta Esegui una query interattiva.

bq

  1. In un ambiente a riga di comando, crea una connessione:

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

    Il parametro --project_id sostituisce il progetto predefinito.

    Sostituisci quanto segue:

    • REGION: la tua regione di connessione
    • PROJECT_ID: il tuo ID progetto Google Cloud
    • CONNECTION_ID: un ID per la tua connessione

    Quando crei una risorsa di connessione, BigQuery crea un account di servizio di sistema univoco e lo associa alla connessione.

    Risoluzione dei problemi: se ricevi il seguente errore di connessione, aggiorna Google Cloud SDK:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Recupera e copia l'ID del account di servizio da utilizzare in un passaggio successivo:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    L'output è simile al seguente:

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

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Python.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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

Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Node.js.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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

Utilizza la risorsa google_bigquery_connection.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

L'esempio seguente crea una connessione alle risorse Cloud denominata my_cloud_resource_connection nella regione US:


# 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 {}
}

Per applicare la configurazione Terraform in un progetto Google Cloud , completa i passaggi descritti nelle sezioni seguenti.

Prepara Cloud Shell

  1. Avvia Cloud Shell.
  2. Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.

    Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi directory.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

Prepara la directory

Ogni file di configurazione Terraform deve avere la propria directory (chiamata anche modulo principale).

  1. In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione .tf, ad esempio main.tf. In questo tutorial, il file è denominato main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.

    Copia il codice campione nel file main.tf appena creato.

    Facoltativamente, copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

  3. Esamina e modifica i parametri di esempio da applicare al tuo ambiente.
  4. Salva le modifiche.
  5. Inizializza Terraform. Devi eseguire questa operazione una sola volta per directory.
    terraform init

    Facoltativamente, per utilizzare l'ultima versione del provider Google, includi l'opzione -upgrade:

    terraform init -upgrade

Applica le modifiche

  1. Esamina la configurazione e verifica che le risorse che Terraform creerà o aggiornerà corrispondano alle tue aspettative:
    terraform plan

    Apporta le correzioni necessarie alla configurazione.

  2. Applica la configurazione Terraform eseguendo il comando seguente e inserendo yes al prompt:
    terraform apply

    Attendi che Terraform visualizzi il messaggio "Apply complete!".

  3. Apri il tuo progetto Google Cloud per visualizzare i risultati. Nella console Google Cloud , vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.

Dopo aver creato la connessione, aprila. Nel riquadro Informazioni sulla connessione, copia l'ID del account di servizio. Questo ID ti servirà per configurare le autorizzazioni per la connessione. Quando crei una risorsa di connessione, BigQuery crea un account di servizio di sistema univoco e lo associa alla connessione.

Configura l'accesso

Devi concedere al account di servizio associato alla nuova connessione l'accesso in scrittura alla tua istanza o al tuo database Spanner. Ti consigliamo di utilizzare il ruolo IAM predefinito Utente database Cloud Spanner (roles/spanner.databaseUser). Questi passaggi richiedono l'ID account di servizio che hai copiato durante la creazione della connessione.

Per concedere l'accesso ai ruoli a livello di database per il account di servizio, segui questi passaggi:

  1. Vai alla pagina Istanze Spanner.

    Vai alla pagina delle istanze

  2. Fai clic sul nome dell'istanza che contiene il tuo database.

  3. Nella scheda Panoramica, seleziona la casella di controllo del tuo database.

  4. Viene visualizzata la finestra di dialogo Riquadro informazioni. Fai clic su Aggiungi entità.

  5. In Nuove entità, inserisci l'ID del account di servizio che hai copiato in precedenza.

  6. Nel campo Seleziona un ruolo, seleziona un ruolo con autorizzazioni spanner.databases.write. Ti consigliamo di utilizzare il ruolo Utente database Cloud Spanner.

  7. Fai clic su Salva.

Esegui l'esportazione utilizzando la connessione CLOUD_RESOURCE

Una volta creata la connessione e concesso l'accesso appropriato, puoi eseguire l'esportazione utilizzando la connessione CLOUD_RESOURCE. L'esempio seguente mostra un comando EXPORT che esporta con una connessione CLOUD_RESOURCE.

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;

Sostituisci quanto segue:

  • PROJECT_ID: il nome del progetto Google Cloud .
  • LOCATION: la località in cui hai creato la connessione, ad esempio us.
  • CONNECTION_NAME: il nome della connessione utilizzata per eseguire l'esportazione, ad esempio myconnection.
  • INSTANCE_ID: il nome dell'istanza del database Spanner.
  • DATABASE_ID: il nome del database Spanner.
  • SPANNER_TABLE_NAME: il nome della tabella Spanner di destinazione esistente.

Esporta continuamente

Per elaborare continuamente una query di esportazione, consulta Crea query continue per istruzioni e codice di esempio.

Ottimizzazione dell'esportazione

Per ottimizzare l'esportazione dei record da BigQuery a Spanner, puoi provare quanto segue:

  • Aumenta il numero di nodi nell'istanza Spanner di destinazione. Nelle prime fasi dell'esportazione, l'aumento del numero di nodi nell'istanza potrebbe non aumentare immediatamente la velocità effettiva di esportazione. Potrebbe verificarsi un leggero ritardo mentre Spanner esegue la suddivisione basata sul carico. Con la suddivisione basata sul carico, la velocità effettiva di esportazione aumenta e si stabilizza. L'utilizzo dell'istruzione EXPORT DATA raggruppa i dati in batch per ottimizzare le scritture in Spanner. Per ulteriori informazioni, vedi Panoramica delle prestazioni.

  • Specifica la priorità HIGH all'interno di spanner_options. Se per l'istanza Spanner è abilitata la scalabilità automatica, l'impostazione della priorità HIGH contribuisce a garantire che l'utilizzo della CPU raggiunga la soglia necessaria per attivare la scalabilità. In questo modo, il gestore della scalabilità automatica può aggiungere risorse di computing in risposta al carico di esportazione, il che può migliorare il throughput complessivo dell'esportazione.

    L'esempio seguente mostra un comando di esportazione di Spanner impostato sulla priorità 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" }"""
    )
  • Evita di ordinare i risultati della query. Se il set di risultati contiene tutte le colonne di chiave primaria, l'esportatore ordina automaticamente le chiavi primarie della tabella di destinazione per semplificare le scritture e ridurre al minimo i conflitti.

    Se la chiave primaria della tabella di destinazione include colonne generate, aggiungi le espressioni delle colonne generate alla query per assicurarti che i dati esportati siano ordinati e raggruppati correttamente.

    Ad esempio, nello schema Spanner seguente, SaleYear e SaleMonth sono colonne generate che costituiscono l'inizio della chiave primaria Spanner:

    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);

    Quando esporti i dati da BigQuery in una tabella Spanner con colonne generate utilizzate nella chiave primaria, è consigliabile, ma non obbligatorio, includere le espressioni per queste colonne generate nella query EXPORT DATA. In questo modo, BigQuery può preordinare i dati correttamente, il che è fondamentale per l'efficienza del raggruppamento in batch e della scrittura in Spanner. I valori per le colonne generate nell'istruzione EXPORT DATA non vengono confermati in Spanner, perché vengono generati automaticamente da Spanner, ma vengono utilizzati per ottimizzare l'esportazione.

    L'esempio seguente esporta i dati in una tabella Spanner Sales la cui chiave primaria utilizza colonne generate. Per ottimizzare le prestazioni di scrittura, la query include espressioni EXTRACT che corrispondono alle colonne SaleYear e SaleMonth generate, consentendo a BigQuery di preordinare i dati prima dell'esportazione:

    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;
  • Per evitare job di lunga durata, esporta i dati per partizione. Suddividi i dati di BigQuery utilizzando una chiave di partizione, ad esempio un timestamp nella query:

    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';

    In questo modo, la query viene completata entro il tempo di esecuzione del job di 6 ore. Per saperne di più su questi limiti, consulta i limiti dei job di query.

  • Per migliorare le prestazioni di caricamento dei dati, elimina l'indice nella tabella Spanner in cui vengono importati i dati. Poi, ricreala al termine dell'importazione.

  • Ti consigliamo di iniziare con un nodo Spanner (1000 unità di elaborazione) e una prenotazione di slot BigQuery minima. Ad esempio, 100 slot o 0 slot di riferimento con scalabilità automatica. Per le esportazioni di dimensioni inferiori a 100 GB, questa configurazione viene in genere completata entro il limite di 6 ore del job. Per esportazioni di dimensioni superiori a 100 GB, aumenta la velocità effettiva eseguendo lo scale up dei nodi Spanner e delle prenotazioni di slot BigQuery, in base alle esigenze. Il throughput scala di circa 5 MiB/s per nodo.

Prezzi

Quando esporti i dati in Spanner utilizzando l'istruzione EXPORT DATA, la fatturazione viene eseguita in base ai prezzi di calcolo della capacità di BigQuery.

Per esportare continuamente in Spanner utilizzando una query continua, devi avere una prenotazione di slot BigQuery Enterprise o Enterprise Plus e un'assegnazione della prenotazione che utilizza il tipo di job CONTINUOUS.

Le esportazioni di BigQuery in Spanner che superano i confini regionali vengono addebitate utilizzando le tariffe di estrazione dati. Per saperne di più, consulta la pagina relativa ai prezzi di BigQuery. Per evitare addebiti per il trasferimento di dati, assicurati che l'esportazione BigQuery venga eseguita nella stessa regione del leader predefinito di Spanner.

Dopo l'esportazione dei dati, ti verrà addebitato il costo per l'archiviazione dei dati in Spanner. Per saperne di più, consulta i prezzi di Spanner.