Esporta i dati in Bigtable (ETL inverso)
Questo documento descrive come configurare un ETL inverso (RETL) da BigQuery a Bigtable. Puoi farlo utilizzando l'istruzione EXPORT DATA
per esportare i dati da una tabella BigQuery a una tabella Bigtable.
Gli utenti BigQuery possono impostare un flusso di lavoro RETL in Bigtable, che combina le funzionalità di analisi di BigQuery con la bassa latenza e l'alta velocità effettiva di Bigtable. Questo flusso di lavoro consente di fornire dati agli utenti delle applicazioni senza esaurire le quote e i limiti su BigQuery.
Caratteristiche delle tabelle Bigtable
Le tabelle Bigtable sono diverse dalle tabelle BigQuery per diversi modi:
- Le tabelle Bigtable e BigQuery sono composte da righe, ma una riga Bigtable è composta da famiglie di chiave di riga e di colonne con 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 si crea una famiglia di colonne, le colonne che le appartengono non devono essere specificate.
- 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 Bigtable hanno sempre una dimensione temporale (nota anche come versione). In qualsiasi riga della stessa colonna può essere archiviato un numero qualsiasi di valori purché il timestamp non sia identico.
- Un timestamp Bigtable viene misurato in microsecondi a partire dalla data ora del periodo Unix: ad esempio, 0 rappresenta 1970-01-01T00:00:00 UTC. I timestamp devono essere un numero non negativo di microsecondi con granularità di millisecondi (sono accettati solo multipli di 1000). Il timestamp predefinito di Bigtable è 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 è richiesto almeno un intervallo di chiavi di chiave di riga o di riga, tranne che per l'analisi completa della tabella.
Per informazioni sulla preparazione dei risultati di BigQuery per l'esportazione in Bigtable, consulta Preparare i risultati della query per l'esportazione.
Prima di iniziare
Concedi i ruoli IAM (Identity and Access Management) che forniscono agli utenti le autorizzazioni necessarie per eseguire ogni attività all'interno di questo documento.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per esportare i dati BigQuery in Bigtable, chiedi all'amministratore di concederti i seguenti ruoli IAM sul tuo progetto:
-
Esporta i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer
) -
Esegui un job di esportazione:
Utente BigQuery (
roles/bigquery.user
) -
Scrivi i dati in una tabella Bigtable:
Bigtable User (
roles/bigtable.user
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.
Potresti anche essere in grado di ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Limitazioni
- La codifica è limitata solo a
BINARY
eTEXT
. - Le esportazioni in Bigtable sono supportate solo da:
- Il set di dati BigQuery di origine deve risiedere all'interno di Stati Uniti (più regioni).
- Il profilo dell'app Bigtable deve essere configurato in modo da instradare i dati a un cluster Bigtable che si trova negli Stati Uniti.
- Le esportazioni in Bigtable sono supportate solo per le versioni BigQuery Enterprise o Enterprise Plus. La versione Standard di BigQuery e il calcolo on demand non sono supportati.
Tipi di BigQuery supportati
Quando vengono scritti in Bigtable sono supportati i seguenti tipi di dati:
Tipo BigQuery | Valore Bigtable scritto |
---|---|
BYTES |
Esportato così com'è. |
STRING |
Transazione convertita a 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 una stringa leggibile che rappresenta un numero. |
FLOAT |
Scrive un 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 un 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 loro 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 dello struct vengono interpretati come colonne e i relativi valori da scrivere 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 dalle tabelle Bigtable esterne per BigQuery.
NULL
valori in Bigtable
I valori NULL
in Bigtable hanno i seguenti vincoli:
Bigtable non ha analogici per i valori
NULL
. L'esportazione di un valoreNULL
per una determinata famiglia di colonne e colonna in Bigtable elimina i valori attuali da una riga Bigtable.Se prima dell'esportazione non esiste un valore Bigtable con una chiave di riga, una famiglia di colonne, un qualificatore di colonne e un timestamp specifici, i valori
NULL
esportati non hanno effetto sulla riga Bigtable.Quando esporti un valore
NULL
di tipoSTRUCT
oJSON
, tutti i valori delle colonne appartenenti alla famiglia di colonne corrispondente della riga interessata vengono eliminati. Devi trasmettere il valoreNULL
al tipoSTRUCT
oJSON
affinché il motore SQL possa associarvi un tipo corretto. La seguente query elimina tutti i dati dalla famiglia di colonnecolumn_family1
con un set di chiavi di riga specificate:EXPORT DATA OPTIONS (...) AS SELECT rowkey, CAST(NULL as STRUCT
) AS column_family1 FROM T Le righe con
NULL
chiavi di riga vengono ignorate durante l'esportazione. Il numero di righe ignorate viene restituito nelle statistiche di esportazione per il 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 seguente tabella descrive i possibili campi utilizzati in una configurazione bigtable_options
:
Nome campo | Descrizione |
---|---|
columnFamilies |
Un array di descrittori 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 di 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 ha codici non UTF-8. I campi qualifierString e qualifierEncoding si escludono a vicenda. Se non vengono specificati né qualifierString né qualifierEncoded , viene utilizzato fieldName 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 un valore fieldName vuoto viene utilizzato con campi di tipo semplice, consulta Preparare i risultati della query per l'esportazione. |
Preparare i risultati della query per l'esportazione
Per esportare i risultati della query in Bigtable, i risultati devono soddisfare i seguenti requisiti:
- Il set di risultati deve contenere una colonna
rowkey
di tipoSTRING
oBYTES
. - Le chiavi di riga, i qualificatori di colonna, i valori e i timestamp non devono superare i limiti di dimensione dei dati all'interno delle tabelle di Bigtable.
- Nel set di risultati deve essere presente almeno una colonna diversa da
rowkey
. - Ogni colonna del set di risultati deve essere uno dei tipi di BigQuery supportati. Eventuali tipi di colonna non supportati devono essere convertiti in uno dei tipi supportati prima di essere esportati in Bigtable.
Bigtable non richiede che i qualificatori di colonna siano nomi di colonna BigQuery validi e Bigtable supporta l'uso di qualsiasi byte. Per informazioni sull'override dei qualificatori di colonna di destinazione per un'esportazione, consulta Configurare le esportazioni con bigtable_options
.
Se utilizzi valori esportati con le API Bigtable, ad esempio ReadModifyWriteRow
, tutti i valori numerici devono utilizzare la codifica binaria corretta.
Per impostazione predefinita, le colonne di risultati autonome di tipo diverso da STRUCT
o JSON
vengono interpretate come valori per le famiglie di colonne di destinazione uguali al nome della colonna dei risultati e come un qualificatore di colonna uguale a una stringa vuota.
Per dimostrare come vengono scritti questi tipi di dati, considera l'esempio SQL riportato di seguito, in cui column
e column2
sono colonne di risultati autonome:
SELECT
x as column1, y as column2
FROM table
In questa query di esempio, SELECT x as column1
scrive valori in Bigtable
sotto la famiglia di colonne column1
e il qualificatore di colonna ''
(stringa vuota) quando
gestisci tipi diversi da JSON
o STRUCT
.
Puoi modificare il modo in cui questi tipi vengono scritti in un'esportazione utilizzando la configurazione di 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'ora
dell'epoca di Unix nel fuso orario UTC.
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 dal punto _CHANGE_TIMESTAMP
della riga dei risultati esportata.
Bigtable non supporta timestamp precedenti all'epoca di Unix (1970-01-01T00:00:00Z). Se il valore di _CHANGE_TIMESTAMP
è NULL
, l'ora del epoch Unix di 0
viene utilizzata come valore del timestamp predefinito.
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 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
Utilizzando questa istruzione con la tabella orders
di BigQuery,
i seguenti dati saranno scritti 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 nuovi valori nella tabella anziché sostituire intere righe. Se sono già presenti valori in Bigtable per una chiave di riga, i nuovi valori possono eseguire l'override parziale o totale dei valori precedenti a seconda della famiglia di colonne, dei nomi delle colonne e dei timestamp delle celle da scrivere.
Esporta più colonne come valori di Protocol Buffer (Protobuf)
I buffer di protocollo offrono un meccanismo flessibile ed efficiente per la serializzazione dei dati strutturati. L'esportazione come Protobuf può essere utile considerando come vengono gestiti i diversi tipi tra BigQuery e Bigtable. Puoi utilizzare le funzioni definite dall'utente (UDF) di BigQuery per esportare i dati come valori binari di Protobuf in Bigtable. Per ulteriori informazioni, vedi Esportare i dati come colonne Protobuf.
Ottimizzazione dell'esportazione
Esistono diversi modi per aumentare la velocità effettiva con cui i record vengono esportati da BigQuery a Bigtable. Puoi ottimizzare il rendimento delle esportazioni nei seguenti modi:
- Aumento del numero di nodi nel cluster di destinazione Bigtable.
- Configurazione del profilo dell'app Bigtable scelto sul routing a cluster singolo.
Prezzi
Per informazioni sui prezzi dell'esportazione dei dati, consulta la pagina Prezzi di BigQuery.
Dopo l'esportazione dei dati, ti viene addebitato il costo di archiviazione dei dati in Bigtable. Per ulteriori informazioni, consulta la pagina relativa ai prezzi di Bigtable.