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 esquemas
  • FULLY_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