Consulta datos de Avro

GoogleSQL para Bigtable te permite consultar, filtrar y proyectar campos individuales de registros de Apache Avro serializados que almacenan las tablas de Bigtable. Si haces referencia a un paquete de esquemas de Avro en tus consultas en SQL, puedes convertir columnas de bytes en registros de Avro estructurados y extraer campos anidados.

Antes de consultar los campos de Avro, debes subir tus esquemas de Avro en un paquete de esquemas, como se describe en Crea y administra esquemas de Avro. Para aprender cómo se asignan las consultas de GoogleSQL a los esquemas de tablas de Bigtable y cómo hacer referencia a las columnas en las sentencias de SQL, consulta la Descripción general de GoogleSQL para Bigtable.

Para consultar datos de Avro con GoogleSQL en Java, usa el método executeQuery en la biblioteca cliente de Cloud Bigtable. Para ver ejemplos de ejecución de consultas en SQL con bibliotecas cliente, consulta Bibliotecas cliente.

Asignaciones de tipos de datos de Avro

Cuando conviertes BYTES serializados en un registro de Avro, GoogleSQL para Bigtable asigna los tipos de esquema de Avro a tipos accesibles para SQL, de la siguiente manera:

Tipo Avro Representación de GoogleSQL Descripción
int, long INT64 Los números enteros con firma de 32 y 64 bits se asignan a números enteros de 64 bits.
float FLOAT32 Un valor de punto flotante de precisión simple
double FLOAT64 Un valor de punto flotante de doble precisión
boolean BOOL Un valor booleano (TRUE o FALSE)
string STRING Una secuencia de caracteres Unicode
bytes BYTES Es una secuencia de bytes sin procesar.
record Objeto de mensaje Accede a los campos anidados con la notación de puntos (por ejemplo, record.field).
enum ENUM Un conjunto de símbolos enumerados
array ARRAY Es un campo repetido. Bigtable no admite arrays anidados.
map<T> Entradas de pares clave-valor repetidas Los mapas de Avro tienen claves STRING. Bigtable admite mapas con valores anulables, como {"type": "map", "values": ["null", "string"]}. Puedes transformar los mapas en un ARRAY<STRUCT<key STRING, value T>> con la función ARRAY_TRANSFORM.
union Campo de valor nulo Bigtable asigna una unión con un tipo nulo y uno no nulo a un campo estándar que admite valores nulos.
fixed Bigtable no admite el tipo fixed. Es una secuencia de bytes de longitud fija.

Datos de ejemplo

En los ejemplos de esta página, se usa un paquete de esquemas de Avro con el ID my_avro. Este paquete contiene el siguiente esquema de registro Transaction en el espacio de nombres 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"}}
  ]
}

Una tabla de Bigtable llamada table almacena los registros de Avro serializados en la familia de columnas cf y el calificador de columna product (cf['product']):

Clave de fila Columna cf['product'] (almacenada como BYTES serializado, se muestra como JSON para facilitar la lectura)
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"}}

Consultas de ejemplo

Después de subir tu paquete de esquema de Avro, puedes usar el operador CAST en GoogleSQL para Bigtable para interpretar los valores BYTES como un registro de Avro.

Convierte una columna y proyecta un campo

Para convertir un valor BYTES en un registro de Avro, especifica el nombre completo del registro en el siguiente formato:

SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME

Reemplaza lo siguiente:

  • SCHEMA_BUNDLE_ID: Es el ID del paquete de esquemas.
  • FULLY_QUALIFIED_RECORD_NAME: Es el nombre completo del registro de Avro, incluido el espacio de nombres definido en tu esquema de Avro, por ejemplo, com.example.billing.Transaction.

Si el paquete de esquema o el nombre de registro especificados no existen, la consulta falla con un estado INVALID_ARGUMENT y un mensaje de error type not found. Si el esquema proporcionado no puede analizar los bytes de la celda, la consulta falla con un estado FAILED_PRECONDITION o INVALID_ARGUMENT.

La siguiente consulta convierte la columna cf['product'] en el registro com.example.billing.Transaction del paquete de esquemas my_avro y proyecta el campo product_name:

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table;

La consulta muestra el siguiente resultado:

product_name (STRING)
Chips
Apple
Libro

Filtra según los campos de Avro

Puedes usar una cláusula WHERE para filtrar filas según los valores de los campos dentro de un registro de Avro.

La siguiente consulta filtra las filas en las que el campo product_category es 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";

La consulta muestra el siguiente resultado:

product_name (STRING)
Chips
Apple

Accede a campos de mapas

Puedes usar la función ARRAY_TRANSFORM para proyectar pares clave-valor de un campo map de Avro como un array de elementos STRUCT.

La siguiente consulta proyecta product_name y transforma el campo de mapa configs en un array 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;

La consulta muestra el siguiente resultado:

product_name (STRING) map_array (ARRAY<STRUCT<key STRING, value STRING>>)
Chips [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}]
Apple []
Libro [{"key": "author", "value": "Jane Doe"}]

Uso con vistas

Puedes hacer referencia a paquetes de esquemas de Avro en vistas materializadas continuas y vistas lógicas.

Si una vista materializada continua o una vista lógica hace referencia a un paquete de esquemas de Avro, no puedes borrar el paquete. Antes de borrar el paquete, debes borrar las vistas materializadas continuas que hagan referencia a él. Para cualquier vista lógica que haga referencia al paquete, debes actualizar las vistas para quitar la referencia o borrarlas.

Con el siguiente comando, se crea una vista materializada continua que agrega los recuentos de transacciones 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;"

Reemplaza lo siguiente:

  • MATERIALIZED_VIEW_ID: Es el ID de la vista materializada continua que hace referencia al paquete de esquemas.
  • INSTANCE_ID: Es el ID de la instancia de Bigtable.

¿Qué sigue?