Interroger les données protobuf

Ce document fournit des exemples de modèles de requêtes courants pour lire et interroger des données de tampon de protocole (protobuf) stockées dans Bigtable.

Avant de lire cette page, familiarisez-vous avec les points suivants :

Exemple de données

Les exemples suivants utilisent une table Music qui stocke des informations sur les albums et les artistes. Les données sont stockées dans une famille de colonnes nommée album_details, avec un qualificatif de colonne album. Le qualificatif de colonne contient des messages protobuf.

Le schéma protobuf est défini dans les fichiers .proto suivants :

  • artist.proto :

    syntax = "proto3";
    
    package package_name;
    
    message Artist {
     string name = 1;
    }
    
  • album.proto :

    syntax = "proto3";
    
    package package_name;
    
    import "artist.proto";
    
    message Album {
     string title = 1;
     Artist artist = 2;
     int32 release_year = 3;
    }
    

Bigtable crée alors un bundle de schéma pour cette table, qui contient l'ensemble de descripteurs suivant pour ces définitions protobuf :

file {
  name: "artist.proto"
  package: "package_name"
  message_type {
    name: "Artist"
    field {
      name: "name"
      number: 1
      label: LABEL_OPTIONAL
      type: TYPE_STRING
      json_name: "name"
    }
  }
  syntax: "proto3"
}
file {
  name: "album.proto"
  package: "package_name"
  dependency: "artist.proto"
  message_type {
    name: "Album"
    field {
      name: "title"
      number: 1
      label: LABEL_OPTIONAL
      type: TYPE_STRING
      json_name: "title"
    }
    field {
      name: "artist"
      number: 2
      label: LABEL_OPTIONAL
      type: TYPE_MESSAGE
      type_name: ".package_name.Artist"
      json_name: "artist"
    }
    field {
      name: "release_year"
      number: 3
      label: LABEL_OPTIONAL
      type: TYPE_INT32
      json_name: "releaseYear"
    }
  }
  syntax: "proto3"
}

Exemples de requêtes

Les exemples suivants montrent comment interroger des données Protobuf à l'aide de GoogleSQL pour les tables externes Bigtable et BigQuery.

Caster une colonne dans un message Protobuf

Vous pouvez utiliser l'opérateur CAST pour interpréter une valeur BYTES comme un message protobuf. Pour ce faire, vous devez fournir le nom complet du message protobuf au format suivant : SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.

Remplacez les éléments suivants :

  • SCHEMA_BUNDLE_ID : ID unique que vous avez attribué à votre bundle de schéma lors de sa création.
  • FULLY_QUALIFIED_MESSAGE_NAME : nom complet du message, qui doit inclure le nom du package défini dans votre fichier proto (par exemple, package_name.message_name).

L'exemple de requête suivant convertit la colonne album en message protobuf Album. Ce message est défini dans le package package_name et fait partie d'un bundle de schéma nommé bundle_name :

SELECT
  CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
  Music;

Accéder aux champs imbriqués

Vous pouvez accéder aux champs imbriqués d'un message protobuf à l'aide de la notation par points.

La requête suivante récupère le nom de l'artiste à partir du message Artist imbriqué dans le message Album :

SELECT
  CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
  Music;

Filtrer en fonction des champs protobuf

Vous pouvez utiliser la clause WHERE pour filtrer les lignes en fonction des valeurs des champs d'un message protobuf.

La requête suivante sélectionne tous les albums de l'artiste Dana A.:

SELECT
  *
FROM
  Music
WHERE
  CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';

Agrégation des champs protobuf

Vous pouvez utiliser des fonctions d'agrégation telles que SUM, AVG, MIN, MAX et COUNT sur les champs numériques de vos messages protobuf.

La requête suivante calcule l'année de sortie moyenne de tous les albums du tableau :

SELECT
  AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
  Music;

Trier par champs protobuf

Vous pouvez utiliser la clause ORDER BY pour trier l'ensemble de résultats en fonction d'un champ de votre message protobuf.

La requête suivante récupère tous les albums et les trie par année de sortie dans l'ordre décroissant :

SELECT
  *
FROM
  Music
ORDER BY
  CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;

Utiliser avec des tables externes BigQuery

Vous pouvez interroger les données protobuf stockées dans Bigtable depuis BigQuery en créant une table externe. Lorsque vous créez la table externe, vous spécifiez le type de colonne en tant que JSON, son encodage en tant que PROTO_BINARY et vous l'associez à un bundle de schéma. Ce processus convertit les octets du message protobuf en données JSON équivalentes, ce qui vous permet d'interroger directement ses champs.

Voici un exemple de fichier de définition de table pour créer une table externe BigQuery sur la table Music :

{
    "sourceFormat": "BIGTABLE",
    "sourceUris": [
        "https://googleapis.com/bigtable/projects/PROJECT_ID/instances/INSTANCE_ID/tables/Music"
    ],
    "bigtableOptions": {
        "columnFamilies" : [
            {
                "familyId": "album_details",
                "columns": [
                    {
                        "qualifierString": "album",
                        "type": "JSON",
                        "encoding": "PROTO_BINARY",
                        "protoConfig": {
                            "schemaBundleId": "bundle_name",
                            "protoMessageName": "package_name.Album"
                        }
                    }
                ]
            }
        ]
    }
}

Une fois la table externe créée, vous pouvez interroger les données protobuf en tant que colonne JSON dans BigQuery.

La requête suivante récupère le titre de tous les albums sortis en 2022 à partir de la table externe BigQuery :

SELECT JSON_VALUE(value, '$.title') AS title
FROM
`PROJECT_ID.DATASET.TABLE_NAME` AS t,
UNNEST(t.album_details.album.cell)
WHERE INT64(JSON_EXTRACT(value, '$.releaseYear')) = 2022;

Étapes suivantes