Valores agregados en el momento de la escritura

Si deseas crear un contador o agregar tus datos en Bigtable en el momento de la escritura, puedes usar agrupaciones. Los agregados son celdas de tablas de Bigtable que agregan valores de celda a medida que se escriben los datos. Cuando agregas un valor nuevo, una función de agregación combina el valor con el valor agregado que ya está en la celda. Otras bases de datos se refieren a capacidades similares como contadores distribuidos.

Puedes leer y escribir valores agregados con la CLI de cbt y las bibliotecas cliente de Bigtable para C++, Go y Java. También puedes leer los resultados de agregación con SQL. Actualizas las celdas agregadas con métodos que envían una solicitud MutateRow con una mutación AddToCell o MergeToCell. MergeToCell te permite combinar un acumulador y AddToCell te permite agregar una entrada.

En este documento, se proporciona una descripción general de los agregados y se describe cómo crear una familia de columnas de agregados. Antes de leer este documento, debes familiarizarte con la descripción general de Bigtable y las operaciones de escritura.

Cuándo usar agregados

Los agregados de Bigtable son útiles en situaciones en las que te interesan los datos de una entidad en forma agregada y no como datos individuales.

Contadores

Puedes crear un contador con celdas agregadas y aumentar el valor en el momento de la escritura, sin las limitaciones que implica realizar una solicitud ReadModifyWriteRow.

Si migras a Bigtable desde bases de datos como Apache Cassandra o Redis, puedes usar los agregados de Bigtable en lugares donde antes dependías de contadores en estos sistemas.

Para trabajar en una guía de inicio rápido que demuestre cómo implementar contadores con la CLI de cbt, consulta Cómo crear y actualizar contadores.

Buckets de tiempo

Puedes usar buckets de tiempo para obtener valores agregados de un período, como una hora, un día o una semana. En lugar de agregar datos antes o después de que se escriben en la tabla, agregas valores nuevos para agregar celdas en la tabla.

Por ejemplo, si administras un servicio que ayuda a organizaciones benéficas a recaudar dinero, es posible que desees conocer el importe de las donaciones en línea por día para cada campaña, pero no necesitas saber la hora exacta de cada donación ni el importe por hora. En tu tabla, las claves de fila representan los IDs de organizaciones benéficas, y creas una familia de columnas agregadas llamada donations. Los calificadores de columna en la fila son los IDs de campaña.

A medida que se recibe cada importe de donación de un día determinado para una campaña, se agrega a la suma en la celda agregada de la columna de ese día. Cada solicitud de adición para la celda usa una marca de tiempo truncada al comienzo del día, de modo que, en efecto, cada solicitud tiene la misma marca de tiempo. La truncación de las marcas de tiempo garantiza que todas las donaciones de ese día se agreguen a la misma celda. Al día siguiente, todas tus solicitudes se ingresan en una celda nueva, con marcas de tiempo truncadas hasta la fecha nueva, y ese patrón continúa.

Según tu caso de uso, puedes optar por crear columnas nuevas para tus agregados nuevos. Según la cantidad de buckets que planeas acumular, podrías considerar un diseño de clave de fila diferente.

Para obtener más información sobre buckets de tiempo, consulta Diseño de esquemas para datos de series temporales.

Optimización de flujos de trabajo

Los agregados te permiten agregar tus datos en tu tabla de Bigtable sin necesidad de usar ningún software de procesamiento ETL o de transmisión para agregar tus datos antes o después de escribirlos en Bigtable. Por ejemplo, si tu aplicación publicó mensajes en Pub/Sub anteriormente y, luego, usó Dataflow para leer los mensajes y agregar los datos antes de escribirlos en Bigtable, en su lugar, podrías enviar los datos directamente a las celdas agregadas en Bigtable.

Agrega familias de columnas

Para crear y actualizar celdas agregadas, debes tener una o más familias de columnas agregadas en tu tabla, es decir, familias de columnas que solo contengan celdas agregadas. Puedes crearlas cuando creas una tabla, o bien puedes agregar una familia de columnas agregadas a una tabla que ya está en uso. Cuando creas la familia de columnas, especificas el tipo de agregación, como la suma.

No puedes convertir una familia de columnas que contiene datos no agregados en una familia de columnas agregadas. Las columnas de las familias de columnas agregadas no pueden contener celdas no agregadas, y las familias de columnas estándar no pueden contener celdas agregadas.

Para crear una tabla nueva con una familia de columnas agregadas, consulta Cómo crear una tabla. Para agregar una familia de columnas aggregate a una tabla, consulta Cómo agregar familias de columnas.

Tipos de agregación

Bigtable admite los siguientes tipos de agregación:

Suma

Cuando escribes un valor en una celda de suma agregada (sum), el valor de la celda se reemplaza por la suma del valor agregado recientemente y el valor de la celda actual. El tipo de entrada que se admite para las sumas es Int64.

Mínimo

Cuando escribes un valor en una celda agregada mínima (min), el valor de la celda se reemplaza por el valor más bajo entre el valor agregado recientemente y el valor de la celda actual. El tipo de entrada que se admite para min es Int64.

Máximo

Cuando escribes un valor en una celda agregada máxima (max), el valor de la celda se reemplaza por el valor más alto entre el valor agregado recientemente y el valor de la celda actual. El tipo de entrada que se admite para max es Int64.

HyperLogLog (HLL)

Cuando escribes un valor en una celda agregada de HLL (inthll), el valor se agrega a un conjunto probabilístico de todos los valores agregados desde el restablecimiento más reciente. El valor de la celda representa el estado de ese conjunto. Para obtener información más general sobre el algoritmo HLL, consulta HyperLogLog.

Puedes leer valores de HLL con la biblioteca Zetasketch. Para obtener más información, consulta el repositorio de GitHub de Zetasketch. El tipo de entrada que se admite para HLL es BYTES.

Marcas de tiempo

Una celda agregada se define por la clave de fila, la familia de columnas, el calificador de columnas y la marca de tiempo. Debes usar la misma marca de tiempo cada vez que agregues datos a la celda. Si envías un valor a la misma clave de fila, familia de columnas y calificador de columna, pero con una marca de tiempo diferente, se crea una nueva celda agregada en la columna.

Todas las solicitudes que se envíen a una celda agregada deben incluir una marca de tiempo.

Tipo de entrada

El tipo de entrada del valor en la solicitud de escritura debe coincidir con el tipo de entrada con el que se creó la familia de columnas. Por ejemplo, si envías un valor de cadena a una familia de columnas configurada para Int64, se rechazará la solicitud.

Tipo de mutación

Una solicitud MutateRow de Bigtable incluye el tipo de mutación, que es un cambio en la tabla. Los tipos de mutación que puedes enviar para crear y actualizar celdas agregadas son AddToCell y MergeToCell. Por el contrario, una escritura no agregada implica una mutación SetCell. También puedes usar mutaciones de eliminación para borrar el valor acumulado de una celda.

En una tabla replicada, una celda agregada converge en el mismo valor final en todos los clústeres dentro de la demora de replicación actual. El valor final es el agregado de todas las mutaciones AddToCell que se enviaron a esa celda en todos los clústeres desde la última operación de eliminación o desde que se creó la celda.

Las operaciones de agregación están sujetas a los mismos límites de operaciones que otras mutaciones de tablas.

AddToCell

Para agregar datos a una celda agregada, como cuando incrementas un contador, envías una mutación AddToCell en una solicitud MutateRow. Para obtener más información, consulta AddToCell en la referencia de la API de Bigtable Data.

MergeToCell

Si quieres copiar datos entre celdas, usa una mutación MergeToCell. Por ejemplo, para copiar el estado de la celda A a la celda B, puedes hacer algo como [DeleteCell(B), MergeToCell(B)] con el valor que lees de la celda A. Para obtener más información, consulta MergeToCell en la referencia de la API de Bigtable Data.

Eliminaciones

Al igual que con los datos no agregados, puedes restablecer un contador o borrar los datos agregados con las mutaciones de la API de datos. Para obtener más información, consulta Mutación en la referencia de la API de Bigtable Data.

Recolección de elementos no utilizados

Las celdas agregadas se tratan como cualquier otra celda durante la recolección de elementos no utilizados: si se marca una celda para su eliminación, la eliminación se replica en todos los clústeres de la instancia. Para obtener más información, consulta Replicación y recolección de basura. Si se envía una solicitud de adición a una celda agregada que la recolección de elementos no utilizados quitó, se crea una celda agregada nueva.

¿Qué sigue?