Esportare i dati in Spanner (ETL inverso)
Questo documento descrive come configurare un flusso di lavoro di estrazione, trasformazione e
caricamento (ETL inverso) 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 flusso di lavoro ETL inverso combina le funzionalità di analisi in BigQuery con bassa latenza e velocità effettiva elevata in Spanner. Questo flusso di lavoro ti consente di pubblicare dati per gli utenti dell'applicazione senza esaurire le quote e i limiti di BigQuery.
Prima di iniziare
Crea un database Spanner che includa una tabella per ricevere i dati esportati.
Concedi ruoli Identity and Access Management (IAM) che forniscono agli utenti le autorizzazioni necessarie per eseguire ogni attività descritta in questo documento.
Crea una prenotazione Enterprise o di livello superiore. Puoi ridurre i costi di calcolo di BigQuery quando esegui esportazioni una tantum in Spanner impostando una capacità di slot di base pari a zero e attivando la scalabilità automatica.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per esportare i dati BigQuery in Spanner, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Esporta i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) -
Esegui un job di estrazione:
Utente BigQuery (
roles/bigquery.user) -
Controlla i parametri dell'istanza Spanner:
Visualizzatore Cloud Spanner (
roles/spanner.viewer) -
Scrivi dati in una tabella Spanner:
Utente database Cloud Spanner (
roles/spanner.databaseUser)
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 BigQuery non supportati |
|---|---|
| Tutti i dialetti |
|
| GoogleSQL |
|
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 è figlio di un'altra tabella (INTERLEAVE IN PARENT) o se la tabella di destinazione ha vincoli di chiave esterna, le chiavi esterne e la chiave padre 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 riuscirà e verrà visualizzato il messaggio "Parent row is missing. Errore "Impossibile scrivere la riga". Se la riga esportata viene scritta in una tabella con vincoli di chiave esterna e fa riferimento a una chiave inesistente, l'esportazione non riuscirà e verrà visualizzato l'errore "Il vincolo di chiave esterna è violato". Quando esporti in più tabelle, ti consigliamo di sequenziare l'esportazione per garantire che l'integrità referenziale venga mantenuta durante l'esportazione. In genere, questo significa esportare le tabelle principali e le tabelle a cui fanno riferimento le chiavi esterne prima delle tabelle che fanno riferimento a queste.
Se la tabella di destinazione dell'esportazione ha vincoli di chiave esterna o è figlio di un'altra tabella (INTERLEAVE IN PARENT), la tabella padre deve essere compilata prima dell'esportazione di una tabella figlio e deve contenere tutte le chiavi corrispondenti. Un tentativo di esportare una tabella secondaria mentre una tabella principale non dispone del set 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 dei job di estrazione di grandi dimensioni, vedi Ottimizzazione dell'esportazione. In alternativa, valuta la possibilità di dividere 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. L'edizione BigQuery Standard e il calcolo on demand non sono supportati.
Non puoi utilizzare le query continue per esportare nelle tabelle Spanner con chiavi primarie generate automaticamente.
Non puoi utilizzare le query continue per l'esportazione nelle tabelle Spanner in un database di dialetti PostgreSQL.
Quando utilizzi query continue per l'esportazione in una tabella Spanner, assicurati di scegliere una chiave primaria che non corrisponda a un numero intero in aumento monotono nella tabella BigQuery. In questo modo, potrebbero verificarsi problemi di rendimento nell'esportazione. Per informazioni sulle chiavi primarie in Spanner e sui modi per attenuare questi problemi di prestazioni, consulta Scegliere una chiave primaria.
Configurare 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 del database.DATABASE_ID: il nome del database.TABLE_NAME: il nome di una tabella di destinazione esistente.CHANGE_TIMESTAMP: il nome della colonna di tipoTIMESTAMPnella tabella Spanner di destinazione. Questa opzione viene utilizzata durante l'esportazione per monitorare il timestamp dell'aggiornamento più recente della riga. Quando questa opzione viene specificata, l'esportazione esegue prima una lettura della riga nella tabella Spanner per assicurarsi che venga scritta solo l'ultima riga aggiornata. Ti consigliamo di specificare una colonna di tipoTIMESTAMPquando esegui un'esportazione continua, in cui l'ordine delle modifiche alle righe con la stessa chiave primaria è importante.- (Facoltativo)
PRIORITY: priorità delle richieste di scrittura. Valori consentiti:LOW,MEDIUM,HIGH. Valore predefinito:MEDIUM. TAG(facoltativo): Tag richiesta per identificare il traffico dell'esportatore nel monitoraggio di Spanner. Valore predefinito:bq_export.
Requisiti per l'esportazione delle query
Per esportare i risultati della query in Spanner, questi 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 NULLper la tabella di destinazione. - I valori delle colonne non devono superare i limiti di dimensione dei dati all'interno delle tabelle di Spanner.
- Prima dell'esportazione in Spanner, tutti i tipi di colonne non supportati devono essere convertiti in uno dei tipi supportati.
Conversioni dei tipi
Per facilità d'uso, lo strumento di esportazione Spanner applica automaticamente le seguenti conversioni di tipo:
| Tipo BigQuery | Tipo di chiave |
|---|---|
| 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.
Il seguente esempio 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 CloudINSTANCE_ID: il nome dell'istanza del databaseDATABASE_ID: il nome del databaseTABLE_NAME: il nome di una tabella di destinazione esistente
Esportare più risultati con lo stesso valore di rowkey
Quando esporti un risultato contenente più righe con lo stesso valore rowkey,
i valori scritti in Spanner finiscono nella stessa
riga di Spanner. Nel set di righe Spanner prodotto dall'esportazione sarà presente solo una riga BigQuery corrispondente (non è garantito quale).
Esportare utilizzando una connessione CLOUD_RESOURCE
Puoi delegare le autorizzazioni di scrittura a una connessione CLOUD_RESOURCE BigQuery 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:
Crea una connessione
Puoi creare o utilizzare una
connessione CLOUD_RESOURCE
esistente per connetterti a Spanner.
Console
Vai alla pagina BigQuery.
Nel riquadro a sinistra, fai clic su Explorer:

Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro a sinistra per aprirlo.
Nel riquadro Explorer, espandi il nome del progetto e fai clic su Connessioni.
Nella pagina Connessioni, fai clic su Crea connessione.
Per Tipo di connessione, scegli Modelli remoti di Vertex AI, funzioni remote, BigLake e Spanner (risorsa Cloud).
Nel campo ID connessione, inserisci un nome per la connessione.
Per Tipo di località, seleziona una località per la connessione. La connessione deve essere collocata insieme alle altre risorse, ad esempio i set di dati.
Fai clic su Crea connessione.
Fai clic su Vai alla connessione.
Nel riquadro Informazioni sulla connessione, copia l'ID dell'account di servizio da utilizzare in un passaggio successivo.
bq
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_idsostituisce il progetto predefinito.Sostituisci quanto segue:
REGION: la tua regione di connessionePROJECT_ID: il tuo Google Cloud ID progettoCONNECTION_ID: un ID per la connessione
Quando crei una risorsa di connessione, BigQuery crea un account di serviziot di sistema univoco e lo associa alla connessione.
Risoluzione dei problemi: se viene visualizzato il seguente errore di connessione, aggiorna Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera e copia l'ID dell'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.
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.
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 di risorsa Cloud denominata
my_cloud_resource_connection nella regione US:
Per applicare la configurazione Terraform in un progetto Google Cloud , completa i passaggi nelle sezioni seguenti.
Prepara Cloud Shell
- Avvia Cloud Shell.
-
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 radice).
-
In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione
.tf, ad esempiomain.tf. In questo tutorial, il file è denominatomain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.
Copia il codice campione nel
main.tfappena creato.(Facoltativo) Copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.
- Rivedi e modifica i parametri di esempio da applicare al tuo ambiente.
- Salva le modifiche.
-
Inizializza Terraform. Devi eseguire questa operazione una sola volta per directory.
terraform init
(Facoltativo) Per utilizzare l'ultima versione del provider Google, includi l'opzione
-upgrade:terraform init -upgrade
Applica le modifiche
-
Rivedi la configurazione e verifica che le risorse che Terraform creerà o aggiornerà corrispondano alle tue aspettative:
terraform plan
Apporta le correzioni necessarie alla configurazione.
-
Applica la configurazione Terraform eseguendo questo comando e inserendo
yesal prompt:terraform apply
Attendi che Terraform visualizzi il messaggio "Apply complete!".
- Apri il tuo Google Cloud progetto 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 dell'account di servizio. 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.
Configurare l'accesso
Devi concedere all'account di servizio associato alla nuova connessione l'accesso in scrittura all'istanza o al 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 quando hai creato la connessione.
Per concedere l'accesso ai ruoli a livello di database per il account di servizio, procedi come segue:
Vai alla pagina delle istanze Spanner.
Fai clic sul nome dell'istanza che contiene il database.
Nella scheda Panoramica, seleziona la casella di controllo per il tuo database.
Viene visualizzata la finestra di dialogo Riquadro informazioni. Fai clic su Aggiungi entità.
In Nuove entità, inserisci l'ID account di servizio che hai copiato in precedenza.
Nel campo Seleziona un ruolo, seleziona un ruolo con autorizzazioni
spanner.databases.write. Ti consigliamo di utilizzare il ruolo Utente database Cloud Spanner.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 esegue l'esportazione 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 esempious.CONNECTION_NAME: il nome della connessione utilizzata per eseguire l'esportazione, ad esempiomyconnection.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.
Esportare in modo continuo
Per elaborare continuamente una query di esportazione, consulta Creare query continue per istruzioni e codice di esempio.
Ottimizzazione dell'esportazione
Per ottimizzare l'esportazione dei record da BigQuery a Spanner, puoi provare a:
Aumenta il numero di nodi nell'istanza di destinazione Spanner. Durante le prime fasi dell'esportazione, l'aumento del numero di nodi nell'istanza potrebbe non aumentare immediatamente la velocità effettiva di esportazione. Durante l'esecuzione della divisione basata sul carico, può verificarsi un leggero ritardo. Con la suddivisione basata sul carico, il throughput di esportazione aumenta e si stabilizza. L'utilizzo dell'istruzione
EXPORT DATAraggruppa i dati per ottimizzare le scritture in Spanner. Per ulteriori informazioni, vedi Panoramica del rendimento.Specifica la priorità
HIGHall'interno dispanner_options. Se la tua istanza Spanner ha la scalabilità automatica abilitata, l'impostazione della prioritàHIGHcontribuisce a garantire che l'utilizzo della CPU raggiunga la soglia necessaria per attivare la scalabilità. In questo modo, lo strumento di scalabilità automatica può aggiungere risorse di calcolo in risposta al carico di esportazione, il che può migliorare la velocità effettiva complessiva dell'esportazione.L'esempio seguente mostra un comando di esportazione 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": "HIGH" }""" )Evita di ordinare i risultati della query. Se il set di risultati contiene tutte le colonne della chiave primaria, l'esportatore ordina automaticamente le chiavi primarie della tabella di destinazione per semplificare le scritture e ridurre al minimo la contesa.
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 vengano ordinati e raggruppati correttamente.
Ad esempio, nel seguente schema Spanner,
SaleYeareSaleMonthsono 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 dati da BigQuery a 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 preordina correttamente i dati, il che è fondamentale per il batching e la scrittura efficienti in Spanner. I valori per le colonne generate nell'istruzioneEXPORT DATAnon vengono commitati 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
Salesla cui chiave primaria utilizza colonne generate. Per ottimizzare le prestazioni di scrittura, la query include espressioniEXTRACTche corrispondono alle colonneSaleYeareSaleMonthgenerate, 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 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 runtime 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 ricrealo al termine dell'importazione.
Ti consigliamo di iniziare con un nodo Spanner (1000 unità di elaborazione) e una prenotazione minima di slot BigQuery. Ad esempio, 100 slot o 0 slot di riferimento con scalabilità automatica. Per le esportazioni inferiori a 100 GB, questa configurazione viene in genere completata entro il limite di 6 ore del job. Per le esportazioni superiori a 100 GB, aumenta la velocità effettiva scalando i nodi Spanner e le prenotazioni di slot BigQuery, in base alle esigenze. Il throughput viene scalato a circa 5 MiB/s per nodo.
Prezzi
Quando esporti i dati in Spanner utilizzando l'istruzione EXPORT DATA,
la fatturazione viene eseguita utilizzando
i prezzi di calcolo della capacità di BigQuery.
Per esportare continuamente in Spanner utilizzando una query continua, devi disporre di una prenotazione di slot BigQuery Enterprise o Enterprise Plus e di un'assegnazione di prenotazione che utilizzi il tipo di job CONTINUOUS.
Le esportazioni BigQuery in Spanner che attraversano i confini regionali vengono addebitate utilizzando le tariffe di estrazione dei dati. Per ulteriori informazioni, vedi 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.
Una volta esportati i dati, ti viene addebitato il costo di archiviazione dei dati in Spanner. Per ulteriori informazioni, consulta la pagina Prezzi di Spanner.