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?
- Obtén más información para crear y administrar esquemas de Avro.
- Obtén información para consultar datos de protobuf.
- Obtén información sobre las prácticas recomendadas para el diseño de esquemas.