Consultar dados Avro
Com o GoogleSQL para Bigtable, é possível consultar, filtrar e projetar campos individuais de registros serializados do Apache Avro que as tabelas do Bigtable armazenam. Ao referenciar um pacote de esquema Avro nas consultas SQL, é possível converter colunas de bytes em registros Avro estruturados e extrair campos aninhados.
Antes de consultar campos do Avro, faça upload dos esquemas do Avro em um pacote de esquemas, conforme descrito em Criar e gerenciar esquemas do Avro. Para saber como as consultas do GoogleSQL são mapeadas para esquemas de tabela do Bigtable e como referenciar colunas em instruções SQL, consulte a visão geral do GoogleSQL para Bigtable.
Para consultar dados do Avro com o GoogleSQL em Java, use o método executeQuery
na biblioteca de cliente do Cloud Bigtable. Para exemplos de execução de consultas SQL com bibliotecas de cliente, consulte Bibliotecas de cliente.
Mapeamentos de tipo de dados do Avro
Quando você converte BYTES serializado em um registro Avro, o GoogleSQL
para Bigtable mapeia os tipos de esquema Avro para tipos acessíveis por SQL,
da seguinte maneira:
| Tipo Avro | Representação do GoogleSQL | Descrição |
|---|---|---|
int, long |
INT64 |
Os números inteiros assinados de 32 e 64 bits são mapeados para números inteiros de 64 bits. |
float |
FLOAT32 |
Um pontuação flutuante de precisão única |
double |
FLOAT64 |
Um pontuação flutuante de precisão dupla |
boolean |
BOOL |
Um valor booleano (TRUE ou FALSE) |
string |
STRING |
Uma sequência de caracteres Unicode |
bytes |
BYTES |
Uma sequência de bytes brutos |
record |
Objeto de mensagem | Acesse campos aninhados usando a notação de ponto (por exemplo,
record.field). |
enum |
ENUM |
Um conjunto de símbolos enumerados |
array |
ARRAY |
Um campo repetido. O Bigtable não oferece suporte a matrizes aninhadas. |
map<T> |
Entradas de chave-valor repetidas | Os mapas do Avro têm chaves STRING. O Bigtable
aceita mapas com valores anuláveis, como
{"type": "map", "values": ["null", "string"]}. É possível
transformar os mapas em um
ARRAY<STRUCT<key STRING, value T>> usando
a função ARRAY_TRANSFORM. |
union |
Campo anulável | O Bigtable mapeia uma união com um tipo nulo e um não nulo para um campo padrão anulável. |
fixed |
O Bigtable não é compatível com o tipo fixed. |
Uma sequência de bytes de comprimento fixo. |
Dados de exemplo
Os exemplos nesta página usam um pacote de esquema Avro com o ID my_avro. Esse
pacote contém o seguinte esquema de registro Transaction no
namespace 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"}}
]
}
Uma tabela do Bigtable chamada table armazena os registros Avro serializados
no grupo de colunas cf e no qualificador de coluna product
(cf['product']):
| Chave de linha | Coluna cf['product'] (armazenada como BYTES serializado, mostrada como JSON para facilitar a leitura) |
|---|---|
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"}} |
Exemplo de consultas
Depois de fazer upload do pacote de esquemas Avro, use o operador CAST no
GoogleSQL para Bigtable para interpretar valores BYTES
como um registro Avro.
Converter uma coluna e projetar um campo
Para converter um valor BYTES em um registro Avro, especifique o nome completo do registro no
seguinte formato:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME
Substitua:
SCHEMA_BUNDLE_ID: o ID do pacote de esquemasFULLY_QUALIFIED_RECORD_NAME: o nome completo do registro Avro, incluindo o namespace definido no esquema Avro, por exemplo,com.example.billing.Transaction.
Se o pacote de esquema ou o nome do registro especificado não existir, a consulta
vai falhar com um status INVALID_ARGUMENT e uma mensagem de erro type not found.
Se o esquema fornecido não puder analisar os bytes da célula, a consulta vai falhar com um status FAILED_PRECONDITION ou INVALID_ARGUMENT.
A consulta a seguir converte a coluna cf['product'] no registro com.example.billing.Transaction no pacote de esquemas my_avro e projeta o campo product_name:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table;
A consulta retorna o seguinte resultado:
product_name (STRING) |
|---|
| Chips |
| Apple |
| Livro |
Filtrar com base em campos do Avro
É possível usar uma cláusula WHERE para filtrar linhas com base nos valores de campos em um registro do Avro.
A consulta a seguir filtra as linhas em que o campo product_category é igual a
"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";
A consulta retorna o seguinte resultado:
product_name (STRING) |
|---|
| Chips |
| Apple |
Acessar campos de mapa
É possível usar a função ARRAY_TRANSFORM para projetar pares de chave-valor de um campo map do Avro como uma matriz de elementos STRUCT.
A consulta a seguir projeta product_name e transforma o campo de mapa configs em uma matriz de elementos 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;
A consulta retorna o seguinte resultado:
product_name (STRING) |
map_array (ARRAY<STRUCT<key STRING, value STRING>>) |
|---|---|
| Chips | [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}] |
| Apple | [] |
| Livro | [{"key": "author", "value": "Jane Doe"}] |
Usar com visualizações
É possível referenciar pacotes de esquemas Avro em visualizações materializadas contínuas e visualizações lógicas.
Se uma visualização materializada contínua ou uma visualização lógica fizer referência a um pacote de esquemas Avro, não será possível excluir o pacote. Antes de excluir o pacote, é necessário excluir todas as visualizações materializadas contínuas que fazem referência a ele. Para as visualizações lógicas que fazem referência ao pacote, é necessário atualizar as visualizações para remover a referência ou excluí-las.
O comando a seguir cria uma visualização materializada contínua que agrega
as contagens de transações por 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;"
Substitua:
MATERIALIZED_VIEW_ID: o ID da visualização materializada contínua que faz referência ao pacote de esquemas.INSTANCE_ID: o ID da instância do Bigtable
A seguir
- Saiba como criar e gerenciar esquemas do Avro.
- Saiba como consultar dados do protobuf.
- Leia sobre as práticas recomendadas de design de esquema.