Consultar dados de protobuf
Este documento fornece exemplos de padrões de consulta comuns para leitura e consulta de dados de buffer de protocolo (protobuf) armazenados no Bigtable.
Antes de ler esta página, familiarize-se com os seguintes tópicos:
Dados de exemplo
Os exemplos a seguir usam uma tabela Music que armazena informações sobre álbuns
e artistas. Os dados são armazenados em um grupo de colunas chamado album_details, com um qualificador de coluna album. O qualificador de coluna contém mensagens protobuf.
O esquema protobuf é definido nos seguintes arquivos 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, o Bigtable cria um pacote de esquema para essa tabela que contém o seguinte conjunto de descritores para essas definições de 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"
}
Exemplo de consultas
Os exemplos a seguir mostram como consultar dados protobuf usando GoogleSQL para tabelas externas do Bigtable e do BigQuery.
Converter uma coluna em uma mensagem do Protobuf
É possível usar o operador CAST para interpretar um valor BYTES como uma mensagem protobuf.
Para isso, forneça o nome completo da mensagem protobuf no
seguinte formato:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.
Substitua:
SCHEMA_BUNDLE_ID: o ID exclusivo que você atribuiu ao pacote de esquemas ao criá-lo.FULLY_QUALIFIED_MESSAGE_NAME: o nome completo da mensagem, que precisa incluir o nome do pacote definido no arquivo proto. Por exemplo,package_name.message_name.
A consulta de exemplo a seguir converte a coluna album na mensagem protobuf Album. Essa mensagem é definida no pacote package_name e faz parte de um
pacote de esquema chamado bundle_name:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
Music;
Acessar campos aninhados
É possível acessar campos aninhados em uma mensagem protobuf usando a notação por pontos.
A consulta a seguir recupera o nome do artista da mensagem aninhada Artist
na mensagem Album:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
Music;
Filtrar com base em campos protobuf
É possível usar a cláusula WHERE para filtrar linhas com base nos valores dos campos em uma mensagem protobuf.
A consulta a seguir seleciona todos os álbuns do artista Dana A.:
SELECT
*
FROM
Music
WHERE
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';
Agregar campos protobuf
É possível usar funções de agregação como SUM, AVG, MIN, MAX e COUNT em campos numéricos nas mensagens protobuf.
A consulta a seguir calcula o ano médio de lançamento de todos os álbuns na tabela:
SELECT
AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
Music;
Ordenar por campos protobuf
É possível usar a cláusula ORDER BY para classificar o conjunto de resultados com base em um campo na mensagem protobuf.
A consulta a seguir recupera todos os álbuns e os classifica por ano de lançamento em ordem decrescente:
SELECT
*
FROM
Music
ORDER BY
CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;
Usar com tabelas externas do BigQuery
É possível consultar dados protobuf armazenados no Bigtable pelo BigQuery criando uma tabela externa. Ao criar a tabela externa, especifique o
tipo de coluna como JSON, a codificação como PROTO_BINARY e associe a um
pacote de esquema. Esse processo converte os bytes da mensagem protobuf nos dados JSON equivalentes, permitindo que você consulte os campos diretamente.
Confira um exemplo de arquivo de definição de tabela para
criar uma tabela externa do BigQuery
na tabela 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"
}
}
]
}
]
}
}
Depois que a tabela externa for criada, você poderá consultar os dados do protobuf como uma coluna JSON no BigQuery.
A consulta a seguir recupera o título de todos os álbuns lançados em 2022 da tabela externa do 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;
A seguir
- Leia sobre as práticas recomendadas de design de esquema para protobufs.