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émasFULLY_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émasINSTANCE_ID: ID de l'instance Bigtable
Étapes suivantes
- Découvrez comment créer et gérer des schémas Avro.
- Découvrez comment interroger des données protobuf.
- Découvrez les bonnes pratiques de conception de schémas.