Esporta i dati in Bigtable (ETL inverso)

L'estrazione, la trasformazione e il caricamento (RETL) inversi da BigQuery a Bigtable ti consentono di combinare l'analisi in BigQuery con la bassa latenza e il throughput elevato di Bigtable. Puoi fornire dati agli utenti dell'applicazione senza esaurire le quote e i limiti di BigQuery.

Per configurare questo workflow, utilizza l'istruzione EXPORT DATA per esportare i dati da una tabella BigQuery a una tabella Bigtable.

Caratteristiche delle tabelle Bigtable

Le tabelle Bigtable sono diverse dalle tabelle BigQuery in diversi modi:

  • Le tabelle Bigtable e BigQuery sono costituite da righe, ma una riga Bigtable è costituita da una chiave di riga e da famiglie di colonne che hanno un numero arbitrario di colonne appartenenti alla stessa famiglia di colonne.
  • Le famiglie di colonne per una determinata tabella vengono create al momento della creazione della tabella, ma possono anche essere aggiunte o rimosse in un secondo momento. Quando viene creata una famiglia di colonne, non è necessario specificare le colonne che ne fanno parte.
  • Le colonne Bigtable non devono essere definite in anticipo e possono essere utilizzate per archiviare i dati nel loro nome (noto anche come qualificatore) entro i limiti di dimensione dei dati all'interno delle tabelle.
  • Le colonne Bigtable possono avere qualsiasi valore binario entro i limiti di dimensione dei dati all'interno delle tabelle.
  • Le colonne di Bigtable hanno sempre una dimensione temporale (nota anche come versione). In qualsiasi riga per la stessa colonna è possibile memorizzare un numero qualsiasi di valori, purché il timestamp non sia identico.
  • Un timestamp Bigtable viene misurato in microsecondi dall'epoca di Unix, ad esempio 0 rappresenta 1970-01-01T00:00:00 UTC. I timestamp devono essere un numero non negativo di microsecondi con granularità in millisecondi (sono accettati solo multipli di 1000 µs). Il timestamp Bigtable predefinito è 0.
  • I dati in Bigtable vengono letti per chiave di riga, più chiavi di riga, intervallo di chiavi di riga o utilizzando un filtro. In tutti i tipi di richieste di lettura, ad eccezione di una scansione completa della tabella, è richiesta almeno una chiave di riga o un intervallo di chiavi di riga.

Per informazioni sulla preparazione dei risultati di BigQuery per l'esportazione in Bigtable, consulta Prepara i risultati delle query per l'esportazione.

Prima di iniziare

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per esportare i dati di BigQuery in Bigtable, 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

Considerazioni sulla località

  • Se il set di dati BigQuery si trova in una multiregione, il profilo dell'app Bigtable deve essere configurato in modo da instradare i dati a un cluster Bigtable all'interno di tale multiregione. Ad esempio, se il tuo set di dati BigQuery si trova nella multiregione US, il cluster Bigtable può essere situato nella regione us-west1 (Oregon), che si trova all'interno degli Stati Uniti.
  • Se il set di dati BigQuery si trova in una singola regione, il profilo dell'app Bigtable deve essere configurato per instradare i dati a un cluster Bigtable nella stessa regione. Ad esempio, se il set di dati BigQuery si trova nella regione asia-northeast1 (Tokyo), anche il cluster Bigtable deve trovarsi nella regione asia-northeast1 (Tokyo).

Per saperne di più, consulta Località Bigtable.

Tipi di BigQuery supportati

I seguenti tipi di dati sono supportati quando vengono scritti in Bigtable:

Tipo BigQuery Valore Bigtable scritto
BYTES Esportato così com'è.
STRING Transazione convertita in BYTES.
INTEGER Se bigtable_options.column_families.encoding è impostato su BINARY, il valore viene scritto in un formato big-endian a 8 byte (il byte più significativo per primo). Se bigtable_options.column_families.encoding è impostato su TEXT, il valore viene scritto come stringa leggibile che rappresenta un numero.
FLOAT Scrive il valore nel formato di output a 8 byte IEEE 754.
BOOLEAN Se bigtable_options.column_families.encoding è impostato su BINARY, il valore viene scritto come valore di 1 byte (false = 0x00 o true = 0x01). Se bigtable_options.column_families.encoding è impostato su TEXT, il valore viene scritto come testo ("true" o "false").
JSON
Una colonna esportata di tipo JSON viene interpretata come un gruppo di colonne appartenenti a una famiglia di colonne Bigtable specifica. I membri dell'oggetto JSON vengono interpretati come colonne e i relativi valori devono essere scritti in Bigtable. Il nome della colonna da scrivere può essere modificato utilizzando la configurazione bigtable_options.

Ad esempio:
    JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY
    
Dove i valori VALUE1 e VALUE2 vengono scritti in Bigtable come colonne FIELD1 e FIELD2 nella famiglia di colonne MY_COLUMN_FAMILY.
STRUCT
Una colonna esportata di tipo STRUCT viene interpretata come un gruppo di colonne appartenenti a una famiglia di colonne Bigtable specifica. I membri della struttura vengono interpretati come colonne e i relativi valori vengono scritti in Bigtable. Il nome della colonna da scrivere può essere modificato utilizzando la configurazione bigtable_options.

Ad esempio:
    STRUCT<FIELD1  STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY
    
Dove i valori FIELD1 e FIELD2 vengono scritti in Bigtable come colonne FIELD1 e FIELD2 nella famiglia di colonne MY_COLUMN_FAMILY.

Questi tipi di dati supportati sono simili alla lettura da tabelle Bigtable esterne per BigQuery.

Valori NULL in Bigtable

I valori NULL in Bigtable hanno i seguenti vincoli:

  • Bigtable non ha un analogo per i valori NULL. L'esportazione di un valore NULL per una determinata famiglia di colonne e una colonna in Bigtable elimina i valori presenti da una riga Bigtable.

  • Se un valore Bigtable con una determinata chiave di riga, famiglia di colonne, qualificatore di colonna e timestamp non esiste prima dell'esportazione, i valori NULL esportati non hanno alcun effetto sulla riga Bigtable.

  • Quando esporti un valore NULL di tipo STRUCT o JSON, vengono eliminati tutti i valori di colonna appartenenti alla famiglia di colonne corrispondente della riga interessata. Devi eseguire il cast del valore NULL al tipo STRUCT o JSON in modo che il motore SQL possa associarvi un tipo corretto. La seguente query elimina tutti i dati dalla famiglia di colonne column_family1 con un insieme di chiavi di riga specificate:

    EXPORT DATA OPTIONS (...) AS
    SELECT
      rowkey,
    CAST(NULL as STRUCT<INT64>) AS column_family1 FROM T
  • Le righe con chiavi di riga NULL vengono ignorate durante l'esportazione. Il numero di righe ignorate viene restituito nelle statistiche di esportazione al chiamante.

Configura le esportazioni con bigtable_options

Puoi utilizzare la configurazione bigtable_options durante un'esportazione per colmare le differenze tra i modelli di archiviazione di BigQuery e Bigtable. La configurazione è espressa sotto forma di stringa JSON, come mostrato nell'esempio seguente:

EXPORT DATA OPTIONS(
   uri="https://bigtable.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
   bigtable_options = """{
     "columnFamilies": [{
       "familyId": "COLUMN_FAMILY_NAME",
       "encoding": "ENCODING_VALUE",
       "columns": [
         {
           "qualifierString": "BIGTABLE_COLUMN_QUALIFIER",
           ["qualifierEncoded": "BASE_64_ENCODED_VALUE",]
           "fieldName": "BIGQUERY_RESULT_FIELD_NAME"
         }
       ]
    }]
   }"""
)

La tabella seguente descrive i possibili campi utilizzati in una configurazione bigtable_options:

Nome campo Descrizione
columnFamilies Un array di descrittori di famiglia di colonne.
columnFamilies.familyId Identificatore della famiglia di colonne Bigtable.
columnFamilies.encoding Il valore può essere impostato su BINARY o TEXT. Per informazioni su come vengono codificati i tipi, consulta Tipi BigQuery supportati.
columnFamilies.columns Un array di mappature delle colonne Bigtable.
columnFamilies.columns.qualifierString (Facoltativo) Un qualificatore di colonna Bigtable. Specifica questo valore se il qualificatore di colonna non contiene codici non UTF-8. I campi qualifierString e qualifierEncoding si escludono a vicenda. Se non vengono specificati né qualifierString né qualifierEncoded, fieldName viene utilizzato come qualificatore di colonna.
columnFamilies.columns.qualifierEncoded (Facoltativo) Qualificatore di colonna con codifica Base64. Simile a qualifierString nel caso in cui il qualificatore di colonna debba avere codici non UTF-8.
columnFamilies.columns.fieldName Obbligatorio: nome del campo del set di risultati BigQuery. In alcuni casi può essere una stringa vuota. Per un esempio di come viene utilizzato un valore fieldName vuoto con campi di tipi semplici, consulta Prepara i risultati delle query per l'esportazione.

Prepara i risultati della query per l'esportazione

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

  • Il set di risultati deve contenere una colonna rowkey di tipo STRING o BYTES.
  • Le chiavi di riga, i qualificatori di colonna, i valori e i timestamp non devono superare i limiti di dimensione dei dati di Bigtable all'interno delle tabelle.
  • Nel set di risultati deve essere presente almeno una colonna diversa da rowkey.
  • Ogni colonna del set di risultati deve essere di uno dei tipi BigQuery supportati. Tutti i tipi di colonna non supportati devono essere convertiti in uno dei tipi supportati prima dell'esportazione in Bigtable.

Bigtable non richiede che i qualificatori di colonna siano nomi di colonna BigQuery validi e supporta l'utilizzo di qualsiasi byte. Per informazioni sull'override dei qualificatori di colonna di destinazione per un'esportazione, consulta Configura le esportazioni con bigtable_options.

Se utilizzi i valori esportati con le API Bigtable, ad esempio ReadModifyWriteRow, tutti i valori numerici devono utilizzare la codifica binaria corretta.

Per impostazione predefinita, le colonne dei risultati autonome di tipi diversi da STRUCT o JSON vengono interpretate come valori per le famiglie di colonne di destinazione uguali al nome della colonna dei risultati e il qualificatore di colonna uguale a una stringa vuota.

Per dimostrare come vengono scritti questi tipi di dati, considera il seguente esempio SQL, dove column e column2 sono colonne dei risultati autonome:

SELECT
  x as column1, y as column2
FROM table

In questa query di esempio, SELECT x as column1 scrive i valori in Bigtable nella famiglia di colonne column1 e nel qualificatore di colonna '' (stringa vuota) quando gestisce tipi diversi da JSON o STRUCT.

Puoi modificare il modo in cui questi tipi vengono scritti in un'esportazione utilizzando la configurazione bigtable_options, come mostrato nell'esempio seguente:

EXPORT DATA OPTIONS (
  …
  bigtable_options="""{
   "columnFamilies" : [
      {
        "familyId": "ordered_at",
        "columns": [
           {"qualifierString": "order_time", "fieldName": ""}
        ]
      }
   ]
}"""
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info,
  EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at
FROM T

In questo esempio, la tabella BigQuery T contiene la seguente riga:

order_id order_timestamp product amount
101 2023-03-28T10:40:54Z Joystick 2

Se utilizzi la configurazione bigtable_options precedente con la tabella T, i seguenti dati vengono scritti in Bigtable:

rowkey sales_info (famiglia di colonne) ordered_at (famiglia di colonne)
101 prodotto quantità order_time
1970-01-01T00:00:00Z Joystick 1970-01-01T00:00:00Z 2 1680000054000

1680000054000 rappresenta 2023-03-28T10:40:54Z in millisecondi dall'epoca di Unix nel fuso orario UTC.

Crea automaticamente nuove famiglie di colonne

Per creare automaticamente nuove famiglie di colonne in una tabella Bigtable, imposta l'opzione auto_create_column_families nell'istruzione EXPORT DATA su true. Questa opzione richiede l'autorizzazione bigtable.tables.update, inclusa in ruoli come Amministratore Bigtable (roles/bigtable.admin).

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE",
auto_create_column_families = true
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info
FROM T

Imposta il timestamp per tutte le celle di una riga utilizzando _CHANGE_TIMESTAMP

Puoi aggiungere una colonna _CHANGE_TIMESTAMP di tipo TIMESTAMP al risultato per l'esportazione. Ogni cella scritta in Bigtable utilizza il valore del timestamp della colonna _CHANGE_TIMESTAMP della riga dei risultati esportata.

Bigtable non supporta timestamp precedenti all'epoca di Unix (1970-01-01T00:00:00Z). Se il valore _CHANGE_TIMESTAMP è NULL, il timestamp predefinito è l'epoca di Unix di 0.

La seguente query scrive le celle per le colonne product e amount con il timestamp specificato nella colonna order_timestamp della tabella T.

EXPORT DATA OPTIONS (...) AS
SELECT
  rowkey,
  STRUCT(product, amount) AS sales_info,
  order_timestamp as _CHANGE_TIMESTAMP
FROM T

Esporta continuamente

Se vuoi elaborare continuamente una query di esportazione, puoi configurarla come query continua.

Esporta più risultati con lo stesso valore rowkey

Quando esporti un risultato contenente più righe con lo stesso valore rowkey, i valori scritti in Bigtable finiscono nella stessa riga di Bigtable.

Puoi utilizzare questo metodo per generare più versioni dei valori delle colonne nella stessa riga. In questo esempio, la tabella orders in BigQuery contiene i seguenti dati:

id customer order_timestamp amount_spent
100 Bruno 2023-01-01T10:10:54Z 10,99
101 Alice 2023-01-02T12:10:50Z 102,7
102 Bruno 2023-01-04T15:17:01Z 11.1

L'utente esegue quindi la seguente istruzione EXPORT DATA:

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS
SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders

L'utilizzo di questa istruzione con la tabella BigQuery orders comporta la scrittura dei seguenti dati in Bigtable:

orders_column_family
Chiave di riga amount_spent
Alice 2023-01-02T12:10:50Z 102,7
Bruno 2023-01-01T10:10:54Z 10,99
2023-01-04T15:17:01Z 11.1

L'esportazione in Bigtable unisce i nuovi valori nella tabella anziché sostituire intere righe. Se i valori sono già presenti in Bigtable per una chiave di riga, i nuovi valori possono sostituire parzialmente o completamente i valori precedenti a seconda della famiglia di colonne, dei nomi delle colonne e dei timestamp delle celle in fase di scrittura.

Esporta più colonne come valori di buffer di protocollo (Protobuf)

I buffer di protocollo forniscono un meccanismo flessibile ed efficiente per la serializzazione dei dati strutturati. L'esportazione come Protobuf può essere utile considerando il modo in cui i diversi tipi vengono gestiti tra BigQuery e Bigtable. Puoi utilizzare le funzioni definite dall'utente (UDF) di BigQuery per esportare i dati come valori binari Protobuf in Bigtable. Per saperne di più, consulta Esporta i dati come colonne Protobuf.

Ottimizzazione dell'esportazione

Puoi modificare la velocità effettiva con cui i record vengono esportati da BigQuery a Bigtable modificando il numero di nodi nel cluster di destinazione Bigtable. La portata (righe scritte al secondo) scala in modo lineare con il numero di nodi nel cluster di destinazione. Ad esempio, se raddoppi il numero di nodi nel cluster di destinazione, la velocità effettiva di esportazione raddoppierà approssimativamente.

Prezzi

Quando esporti i dati in una query standard, la fatturazione viene eseguita in base ai prezzi per l'estrazione dei dati. Quando esporti i dati in una query continua, la fatturazione viene eseguita in base ai prezzi di calcolo della capacità di BigQuery. Per eseguire query continue, devi disporre di una prenotazione che utilizzi la versione Enterprise o Enterprise Plus e di un'assegnazione della prenotazione che utilizzi il tipo di job CONTINUOUS.

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