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 schemi
  • FULLY_QUALIFIED_RECORD_NAME: il nome completo del record Avro, incluso lo spazio dei nomi definito nello schema Avro, ad esempio com.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 schemi
  • INSTANCE_ID: l'ID dell'istanza Bigtable

Passaggi successivi