Consulta datos de protobuf
En este documento, se proporcionan ejemplos de patrones de consultas comunes para leer y consultar datos de búfer de protocolo (protobuf) almacenados en Bigtable.
Antes de leer esta página, familiarízate con lo siguiente:
Datos de ejemplo
En los siguientes ejemplos, se usa una tabla Music que almacena información sobre álbumes y artistas. Los datos se almacenan en una familia de columnas llamada album_details, con un calificador de columna album. El calificador de columna contiene mensajes de protobuf.
El esquema de protobuf se define en los siguientes archivos .proto:
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; }
Como resultado, Bigtable crea un paquete de esquema para esta tabla que contiene el siguiente conjunto de descriptores para estas definiciones de .proto:
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"
}
Consultas de ejemplo
En los siguientes ejemplos, se muestra cómo consultar datos de Protobuf con GoogleSQL para tablas externas de Bigtable y BigQuery.
Cómo convertir una columna en un mensaje de Protobuf
Puedes usar el operador CAST para interpretar un valor de BYTES como un mensaje de protobuf.
Para ello, debes proporcionar el nombre completo del mensaje de protobuf en el siguiente formato: SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.
Reemplaza lo siguiente:
SCHEMA_BUNDLE_ID: Es el ID único que le asignaste a tu paquete de esquemas cuando lo creaste.FULLY_QUALIFIED_MESSAGE_NAME: Es el nombre completo del mensaje, que debe incluir el nombre del paquete definido en tu archivo .proto, por ejemplo,package_name.message_name.
En la siguiente consulta de ejemplo, se convierte la columna album al mensaje Album de protobuf. Este mensaje se define en el paquete package_name y forma parte de un paquete de esquemas llamado bundle_name:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
Music;
Accede a campos anidados
Puedes acceder a los campos anidados dentro de un mensaje de protobuf con la notación de puntos.
La siguiente consulta recupera el nombre del artista del mensaje Artist anidado dentro del mensaje Album:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
Music;
Filtra según los campos de protobuf
Puedes usar la cláusula WHERE para filtrar filas según los valores de los campos dentro de un mensaje de protobuf.
La siguiente consulta selecciona todos los álbumes del artista Dana A.:
SELECT
*
FROM
Music
WHERE
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';
Agrega campos de protobuf
Puedes usar funciones de agregación como SUM, AVG, MIN, MAX y COUNT en campos numéricos dentro de tus mensajes de Protobuf.
La siguiente consulta calcula el año de lanzamiento promedio de todos los álbumes de la tabla:
SELECT
AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
Music;
Ordenar por campos de Protobuf
Puedes usar la cláusula ORDER BY para ordenar el conjunto de resultados según un campo de tu mensaje .proto.
La siguiente consulta recupera todos los álbumes y los ordena por año de lanzamiento en orden descendente:
SELECT
*
FROM
Music
ORDER BY
CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;
Uso con tablas externas de BigQuery
Puedes consultar los datos de protobuf almacenados en Bigtable desde BigQuery creando una tabla externa. Cuando creas la tabla externa, especificas el tipo de columna como JSON, su codificación como PROTO_BINARY y la asocias con un paquete de esquema. Este proceso convierte los bytes del mensaje de protobuf en los datos JSON equivalentes, lo que te permite consultar sus campos directamente.
A continuación, se muestra un ejemplo de un archivo de definición de tabla para crear una tabla externa de BigQuery sobre la tabla 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"
}
}
]
}
]
}
}
Una vez que se crea la tabla externa, puedes consultar los datos de protobuf como una columna JSON en BigQuery.
La siguiente consulta recupera el título de todos los álbumes lanzados en 2022 de la tabla externa de 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;
¿Qué sigue?
- Obtén más información sobre las prácticas recomendadas para el diseño de esquemas de búferes de protocolo.