Interroger des données Avro

GoogleSQL pour Bigtable vous permet d'interroger, de filtrer et de projeter des champs individuels à partir d'enregistrements Apache Avro sérialisés stockés dans des tables Bigtable. En référençant un bundle de schémas Avro dans vos requêtes SQL, vous pouvez caster des colonnes d'octets en enregistrements Avro structurés et extraire des champs imbriqués.

Avant d'interroger des champs Avro, vous devez importer vos schémas Avro dans un groupe de schémas, comme décrit dans Créer et gérer des schémas Avro. Pour savoir comment les requêtes GoogleSQL sont mappées aux schémas de table Bigtable et comment référencer des colonnes dans des instructions SQL, consultez la présentation de GoogleSQL pour Bigtable.

Pour interroger des données Avro avec GoogleSQL en Java, utilisez la méthode executeQuery de la bibliothèque cliente Cloud Bigtable. Pour obtenir des exemples d'exécution de requêtes SQL avec des bibliothèques clientes, consultez Bibliothèques clientes.

Mappages des types de données Avro

Lorsque vous castez un BYTES sérialisé en un enregistrement Avro, GoogleSQL pour Bigtable mappe les types de schéma Avro aux types accessibles en SQL, comme suit :

Type Avro Représentation GoogleSQL Description
int, long INT64 Les entiers signés de 32 et 64 bits sont mappés à des entiers de 64 bits.
float FLOAT32 Valeur à virgule flottante à précision simple
double FLOAT64 Valeur à virgule flottante à double précision
boolean BOOL Valeur booléenne (TRUE ou FALSE)
string STRING Une séquence de caractères Unicode
bytes BYTES Séquence d'octets bruts
record Objet Message Accédez aux champs imbriqués à l'aide de la notation par points (par exemple, record.field).
enum ENUM Un ensemble de symboles énumérés
array ARRAY Champ répété. Bigtable n'est pas compatible avec les tableaux imbriqués.
map<T> Entrées de clé-valeur répétées Les mappages Avro ont des clés STRING. Bigtable accepte les mappages avec des valeurs nullables, telles que {"type": "map", "values": ["null", "string"]}. Vous pouvez transformer les cartes en ARRAY<STRUCT<key STRING, value T>> à l'aide de la fonction ARRAY_TRANSFORM.
union Champ pouvant être vide Bigtable mappe une union avec un type nul et un type non nul à un champ standard pouvant être nul.
fixed Bigtable n'est pas compatible avec le type fixed. Séquence d'octets de longueur fixe.

Exemple de données

Les exemples de cette page utilisent un groupe de schémas Avro avec l'ID my_avro. Ce bundle contient le schéma d'enregistrement Transaction suivant dans l'espace de noms 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"}}
  ]
}

Une table Bigtable nommée table stocke les enregistrements Avro sérialisés dans la famille de colonnes cf et le qualificatif de colonne product (cf['product']) :

Clé de ligne Colonne cf['product'] (stockée sous forme de BYTES sérialisé, affichée au format JSON pour plus de lisibilité)
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"}}

Exemples de requêtes

Après avoir importé votre bundle de schémas Avro, vous pouvez utiliser l'opérateur CAST dans GoogleSQL pour Bigtable afin d'interpréter les valeurs BYTES en tant qu'enregistrement Avro.

Caster une colonne et projeter un champ

Pour caster une valeur BYTES en un enregistrement Avro, spécifiez le nom complet de l'enregistrement au format suivant :

SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME

Remplacez les éléments suivants :

  • SCHEMA_BUNDLE_ID : ID du bundle de schémas
  • FULLY_QUALIFIED_RECORD_NAME : nom complet de l'enregistrement Avro, y compris l'espace de noms défini dans votre schéma Avro (par exemple, com.example.billing.Transaction).

Si le bundle de schémas ou le nom d'enregistrement spécifié n'existe pas, la requête échoue avec l'état INVALID_ARGUMENT et le message d'erreur type not found. Si le schéma fourni ne peut pas analyser les octets de la cellule, la requête échoue avec l'état FAILED_PRECONDITION ou INVALID_ARGUMENT.

La requête suivante caste la colonne cf['product'] dans l'enregistrement com.example.billing.Transaction du bundle de schéma my_avro et projette le champ product_name :

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table;

La requête renvoie le résultat suivant :

product_name (STRING)
Puces
Apple
Réserver

Filtrer en fonction des champs Avro

Vous pouvez utiliser une clause WHERE pour filtrer les lignes en fonction des valeurs des champs d'un enregistrement Avro.

La requête suivante filtre les lignes où le champ product_category est égal à "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 requête renvoie le résultat suivant :

product_name (STRING)
Puces
Apple

Accéder aux champs d'une carte

Vous pouvez utiliser la fonction ARRAY_TRANSFORM pour projeter des paires clé/valeur d'un champ Avro map sous la forme d'un tableau d'éléments STRUCT.

La requête suivante projette product_name et transforme le champ de mappage configs en un tableau d'éléments 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 requête renvoie le résultat suivant :

product_name (STRING) map_array (ARRAY<STRUCT<key STRING, value STRING>>)
Puces [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}]
Apple []
Réserver [{"key": "author", "value": "Jane Doe"}]

Utiliser avec des vues

Vous pouvez référencer des bundles de schémas Avro dans des vues matérialisées continues et des vues logiques.

Si une vue matérialisée continue ou une vue logique fait référence à un groupe de schémas Avro, vous ne pouvez pas supprimer ce groupe. Avant de supprimer le bundle, vous devez supprimer toutes les vues matérialisées continues qui le référencent. Pour toutes les vues logiques qui font référence au bundle, vous devez soit mettre à jour les vues pour supprimer la référence, soit les supprimer.

La commande suivante crée une vue matérialisée continue qui agrège le nombre de transactions par 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;"

Remplacez les éléments suivants :

  • MATERIALIZED_VIEW_ID : ID de la vue matérialisée continue qui référence le bundle de schémas
  • INSTANCE_ID : ID de l'instance Bigtable

Étapes suivantes