Esportare i dati in Bigtable (ETL inverso)
Questo documento descrive come configurare l'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.
Puoi utilizzare un workflow RETL in Bigtable per combinare le funzionalità di analisi di BigQuery con la bassa latenza e il throughput elevato di Bigtable. Questo workflow ti consente di erogare dati agli utenti dell'applicazione senza esaurire le quote e i limiti di BigQuery.
Caratteristiche delle tabelle Bigtable
Le tabelle Bigtable sono diverse dalle tabelle BigQuery in diversi modi:
- Sia le tabelle Bigtable sia le tabelle 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 appartengono a questa famiglia.
- 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 nelle tabelle.
- Le colonne Bigtable possono avere qualsiasi valore binario entro i limiti di dimensione dei dati nelle tabelle.
- Le colonne Bigtable hanno sempre una dimensione temporale (nota anche come versione). In una riga è possibile archiviare un numero qualsiasi di valori per la stessa colonna, a condizione che il timestamp non sia identico.
- Un timestamp Bigtable viene misurato in microsecondi dall'epoca Unix—ad esempio, 0 rappresenta 1970-01-01T00:00:00 UTC. I timestamp devono essere un numero non negativo di microsecondi con una granularità di millisecondi (sono accettati solo multipli di 1000 us). 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. È richiesta almeno una chiave di riga o un intervallo di chiavi di riga in tutti i tipi di richieste di lettura, ad eccezione di una scansione completa della tabella.
Per informazioni sulla preparazione dei risultati di BigQuery per l'esportazione in Bigtable, consulta Preparare i risultati delle query per l'es1portazione.
Prima di iniziare
Devi creare un' istanza Bigtable e una tabella Bigtable per ricevere i dati esportati.
Concedi i ruoli IAM (Identity and Access Management) che forniscono agli utenti le autorizzazioni necessarie per eseguire ogni attività descritta in 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 nel tuo progetto:
-
Esportare i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) -
Eseguire un job di estrazione:
Utente BigQuery (
roles/bigquery.user) -
Scrivere i dati in una tabella Bigtable:
Utente Bigtable (
roles/bigtable.user) -
Creare automaticamente nuove famiglie di colonne per una tabella Bigtable:
Amministratore Bigtable (
roles/bigtable.admin)
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
- La codifica è limitata solo a
BINARYeTEXT. - Il profilo dell'app Bigtable di destinazione deve essere configurato con il routing a cluster singolo e un livello di priorità della richiesta basso.
- Il profilo dell'app Bigtable deve essere configurato per il routing dei dati a un cluster Bigtable collocato insieme al set di dati BigQuery. Per ulteriori informazioni, consulta Considerazioni sulla località.
- Le esportazioni in Bigtable sono supportate solo per le versioni BigQuery Enterprise o Enterprise Plus. La versione BigQuery Standard e il computing on demand non sono supportati.
- Le esportazioni in Bigtable sono supportate solo per le prenotazioni con un'assegnazione
QUERY.
Considerazioni sulla località
- Se il set di dati BigQuery si trova in una regione multipla, il
profilo dell'app Bigtable
deve essere configurato per il routing dei dati a un cluster Bigtable all'interno di quella regione multipla.
Ad esempio, se il set di dati BigQuery si trova nella regione multiregionale
US, il cluster Bigtable può trovarsi nella regioneus-west1(Oregon), che si trova negli Stati Uniti. - Se il set di dati BigQuery si trova in una singola regione, il profilo dell'app Bigtable
deve essere configurato per il routing dei dati a un cluster Bigtable nella
stessa regione. Ad esempio, se il set di dati BigQuery si trova nella
asia-northeast1(Tokyo) region, anche il cluster Bigtable deve trovarsi nellaasia-northeast1(Tokyo) region.
Per ulteriori informazioni, consulta Località Bigtable.
Tipi BigQuery supportati
I seguenti tipi di dati sono supportati quando vengono scritti in Bigtable:
| Tipo BigQuery | Valore Bigtable scritto |
|---|---|
BYTES |
Esportato così com'è. |
STRING |
Convertito in BYTES. |
INTEGER |
Se bigtable_options.column_families.encoding è impostato su
BINARY, il valore viene scritto in un formato big-endian a 8 byte
(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 il valore nel formato di output IEEE 754 a 8 byte. |
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 relativi valori devono essere scritti in Bigtable. Il nome della colonna da scrivere può essere modificato utilizzando la bigtable_options configurazione. 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 devono essere scritti in Bigtable. Il nome della colonna da scrivere può essere modificato utilizzando la bigtable_options configurazione. 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 valoreNULLper 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
NULLesportati non hanno alcun effetto sulla riga Bigtable.Quando esporti un valore
NULLdi tipoSTRUCToJSON, tutti i valori delle colonne appartenenti alla famiglia di colonne corrispondente della riga interessata vengono eliminati. Devi eseguire il cast del valoreNULLal tipoSTRUCToJSONaffinché il motore SQL possa collegarvi un tipo corretto. La seguente query elimina tutti i dati dalla famiglia di colonnecolumn_family1con 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
NULLvengono ignorate durante l'esportazione. Il numero di righe ignorate viene restituito nelle statistiche di esportazione al chiamante.
Configurare le esportazioni con bigtable_options
Puoi utilizzare la configurazione bigtable_options durante un'esportazione per colmare le differenze tra i modelli di archiviazione BigQuery e Bigtable. La configurazione viene 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 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 viene utilizzato un valore vuoto fieldName con i campi di tipi semplici, consulta Preparare i risultati delle query per l'esportazione. |
Preparare i risultati delle 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
rowkeydi tipoSTRINGoBYTES. - Le chiavi di riga, i qualificatori di colonna, i valori e i timestamp non devono superare i limiti di dimensione dei dati Bigtable nelle 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. Prima di esportare in Bigtable, tutti i tipi di colonne non supportati devono essere convertiti in uno dei tipi supportati.
Bigtable non richiede che i qualificatori di colonna siano nomi di colonne BigQuery validi e supporta l'utilizzo di qualsiasi byte. Per informazioni sulla sostituzione dei qualificatori di colonna di destinazione per un'esportazione, consulta Configurare 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 autonomi 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 mostrare come vengono scritti questi tipi di dati, considera il seguente esempio SQL,
in cui column e column2 sono colonne dei risultati autonomi:
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 la modalità di scrittura di questi tipi in un'esportazione utilizzando la
bigtable_options configurazione, 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, in Bigtable vengono scritti i seguenti dati:
rowkey |
sales_info (famiglia di colonne) |
ordered_at (famiglia di colonne) |
|||
|---|---|---|---|---|---|
| 101 | product | amount | 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 Unix nel fuso orario UTC.
Creare automaticamente nuove famiglie di colonne
Per creare automaticamente nuove famiglie di colonne in una tabella Bigtable,
imposta l'opzione auto_create_column_families nell'
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 TImpostare 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 di _CHANGE_TIMESTAMP della riga del risultato esportato.
Bigtable non supporta i timestamp precedenti all'epoca Unix (1970-01-01T00:00:00Z). Se il valore di _CHANGE_TIMESTAMP è NULL, viene utilizzato il tempo dell'epoca Unix di 0 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
Esportare continuamente
Se vuoi elaborare continuamente una query di esportazione, puoi configurarla come una query continua.
Esportare 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 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 ordersL'utilizzo di questa istruzione con la tabella orders di BigQuery 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 alla 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.
Esportare più colonne come valori del 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 se si considera il modo in cui 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 Protobuf in Bigtable. Per ulteriori informazioni, consulta Esportare 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 Bigtable di destinazione. La velocità effettiva (righe scritte al secondo) aumenta linearmente 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à all'incirca.
Prezzi
Quando esporti i dati in una query standard, ti vengono addebitati i costi utilizzando
i prezzi di estrazione dei dati.
Quando esporti i dati in una query continua, ti vengono addebitati i costi utilizzando
i prezzi di computing 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 di prenotazione
che utilizzi il tipo di prestazione CONTINUOUS.
Una volta esportati i dati, ti vengono addebitati i costi per l'archiviazione dei dati in Bigtable. Per ulteriori informazioni, consulta i prezzi di Bigtable.