Esegui query sui dati Avro
GoogleSQL per Bigtable ti consente di eseguire query, filtrare e proiettare singoli campi da record Apache Avro serializzati archiviati dalle tabelle Bigtable. Facendo riferimento a un bundle di schemi Avro nelle query SQL, puoi convertire le colonne di byte in record Avro strutturati ed estrarre i campi nidificati.
Prima di eseguire query sui campi Avro, devi caricare gli schemi Avro in un bundle di schemi, come descritto in Crea e gestisci schemi Avro. Per scoprire come le query GoogleSQL vengono mappate agli schemi delle tabelle Bigtable e come fare riferimento alle colonne nelle istruzioni SQL, consulta la panoramica di GoogleSQL per Bigtable.
Per eseguire query sui dati Avro con GoogleSQL in Java, utilizza il metodo executeQuery nella libreria client di Cloud Bigtable. Per esempi di esecuzione di query SQL con le librerie client, consulta Librerie client.
Mappature dei tipi di dati Avro
Quando esegui il cast di BYTES serializzati in un record Avro, GoogleSQL per Bigtable mappa i tipi di schema Avro ai tipi accessibili da SQL, come segue:
| Tipo Avro | Rappresentazione GoogleSQL | Descrizione |
|---|---|---|
int, long |
INT64 |
I numeri interi con segno a 32 e 64 bit vengono mappati a numeri interi a 64 bit. |
float |
FLOAT32 |
Un valore in virgola mobile a precisione singola |
double |
FLOAT64 |
Un valore in rappresentazione in virgola mobile a precisione doppia |
boolean |
BOOL |
Un valore booleano (TRUE o FALSE) |
string |
STRING |
Una sequenza di caratteri Unicode |
bytes |
BYTES |
Una sequenza di byte non elaborati |
record |
Oggetto del messaggio | Accedi ai campi nidificati utilizzando la notazione con punto (ad esempio, record.field). |
enum |
ENUM |
Un set di simboli enumerati |
array |
ARRAY |
Un campo ripetuto. Bigtable non supporta gli array nidificati. |
map<T> |
Voci di coppie chiave-valore ripetute | Le mappe Avro hanno STRING chiavi. Bigtable supporta mappe con valori nullable, come {"type": "map", "values": ["null", "string"]}. Puoi trasformare le mappe in un ARRAY<STRUCT<key STRING, value T>> utilizzando la funzione ARRAY_TRANSFORM. |
union |
Campo che ammette valori null | Bigtable mappa un'unione con un tipo null e un tipo non null a un campo standard che ammette valori null. |
fixed |
Bigtable non supporta il tipo fixed. |
Una sequenza di byte di lunghezza fissa. |
Dati di esempio
Gli esempi in questa pagina utilizzano un bundle di schemi Avro con l'ID my_avro. Questo bundle contiene il seguente schema di record Transaction nello spazio dei nomi com.example.billing:
{
"type": "record",
"namespace": "com.example.billing",
"name": "Transaction",
"fields": [
{"name": "product_name", "type": "string"},
{"name": "product_category", "type": "string"},
{"name": "configs", "type": {"type": "map", "values": "string"}}
]
}
Una tabella Bigtable denominata table archivia i record Avro serializzati nella famiglia di colonne cf e nel qualificatore di colonna product (cf['product']):
| Chiave di riga | Colonna cf['product'] (archiviata come BYTES serializzato, mostrata come JSON per leggibilità) |
|---|---|
row1 |
{"product_name": "Chips", "product_category": "yummy food", "configs": {"size": "large", "flavor": "BBQ"}} |
row2 |
{"product_name": "Apple", "product_category": "yummy food", "configs": {}} |
row3 |
{"product_name": "Book", "product_category": "reading", "configs": {"author": "Jane Doe"}} |
Esempi di query
Dopo aver caricato il bundle di schemi Avro, puoi utilizzare l'operatore CAST in GoogleSQL per Bigtable per interpretare i valori BYTES come record Avro.
Esegui il cast di una colonna e proietta un campo
Per eseguire il cast di un valore BYTES in un record Avro, specifica il nome completo del record nel seguente formato:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME
Sostituisci quanto segue:
SCHEMA_BUNDLE_ID: l'ID del bundle di schemiFULLY_QUALIFIED_RECORD_NAME: il nome completo del record Avro, incluso lo spazio dei nomi definito nello schema Avro, ad esempiocom.example.billing.Transaction
Se il bundle di schemi o il nome del record specificato non esiste, la query non va a buon fine con uno stato INVALID_ARGUMENT e un messaggio di errore type not found.
Se lo schema fornito non riesce ad analizzare i byte della cella, la query non va a buon fine con uno stato FAILED_PRECONDITION o INVALID_ARGUMENT.
La seguente query esegue il cast della colonna cf['product'] al record com.example.billing.Transaction nel bundle dello schema my_avro e proietta il campo product_name:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table;
La query restituisce il seguente risultato:
product_name (STRING) |
|---|
| Chip |
| Apple |
| Libro |
Filtra in base ai campi Avro
Puoi utilizzare una clausola WHERE per filtrare le righe in base ai valori dei campi all'interno di un record Avro.
La seguente query filtra le righe in cui il campo product_category è uguale a "yummy food":
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table
WHERE
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_category = "yummy food";
La query restituisce il seguente risultato:
product_name (STRING) |
|---|
| Chip |
| Apple |
Campi della mappa di accesso
Puoi utilizzare la funzione ARRAY_TRANSFORM per proiettare coppie chiave/valore da un campo Avro map come array di elementi STRUCT.
La seguente query proietta product_name e trasforma il campo mappa configs in un array di elementi STRUCT<key STRING, value STRING>:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name,
ARRAY_TRANSFORM(
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).configs,
e -> STRUCT(e.key, e.value)
) AS map_array
FROM
table;
La query restituisce il seguente risultato:
product_name (STRING) |
map_array (ARRAY<STRUCT<key STRING, value STRING>>) |
|---|---|
| Chip | [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}] |
| Apple | [] |
| Libro | [{"key": "author", "value": "Jane Doe"}] |
Utilizzo con le visualizzazioni
Puoi fare riferimento ai bundle di schemi Avro nelle viste materializzate continue e nelle viste logiche.
Se una vista materializzata continua o una vista logica fa riferimento a un bundle di schemi Avro, non puoi eliminare il bundle. Prima di eliminare il bundle, devi eliminare tutte le viste materializzate continue che fanno riferimento al bundle. Per tutte le visualizzazioni logiche che fanno riferimento al bundle, devi aggiornarle per rimuovere il riferimento o eliminarle.
Il seguente comando crea una vista materializzata continua che aggrega i conteggi delle transazioni per product_name:
gcloud bigtable materialized-views create MATERIALIZED_VIEW_ID \
--instance=INSTANCE_ID \
--query="SELECT CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name AS product, COUNT(*) AS transaction_count FROM table GROUP BY product;"
Sostituisci quanto segue:
MATERIALIZED_VIEW_ID: l'ID della vista materializzata continua che fa riferimento al bundle di schemiINSTANCE_ID: l'ID dell'istanza Bigtable
Passaggi successivi
- Scopri come creare e gestire gli schemi Avro.
- Scopri come eseguire query sui dati protobuf.
- Scopri le best practice per la progettazione dello schema.