Agregar valores no momento da gravação

Se você quiser criar um contador ou agregar seus dados no Bigtable no momento da gravação, use agregações. Os agregados são células de tabela do Bigtable que agregam valores de células conforme os dados são gravados. Quando você adiciona um novo valor, uma função de agregação mescla o valor com o valor agregado que já está na célula. Outros bancos de dados se referem a recursos semelhantes como contadores distribuídos.

É possível ler e gravar valores agregados usando a CLI cbt e as bibliotecas de cliente do Bigtable para C++, Go e Java. Também é possível ler os resultados de agregação usando SQL. Você atualiza células agregadas usando métodos que enviam uma solicitação MutateRow com uma mutação AddToCell ou MergeToCell. MergeToCell permite mesclar em um acumulador, e AddToCell permite adicionar uma entrada.

Este documento apresenta uma visão geral dos agregados e descreve como criar uma família de colunas agregadas. Antes de ler este documento, você precisa conhecer a visão geral do Bigtable e as gravações.

Quando usar agregações

Os agregados do Bigtable são úteis em situações em que você se preocupa com os dados de uma entidade em agregado e não como pontos de dados individuais.

Contadores

É possível criar um contador usando células agregadas e incrementar o valor no momento da gravação, sem as limitações envolvidas na solicitação ReadModifyWriteRow.

Se você estiver migrando para o Bigtable de bancos de dados como o Apache Cassandra ou o Redis, use os agregados do Bigtable em lugares em que você já usava contadores nesses sistemas.

Para conferir um guia de início rápido que demonstra como implementar contadores usando a CLI cbt, consulte Criar e atualizar contadores.

Intervalos de tempo

Você pode usar intervalos de tempo para receber valores agregados de um período, como uma hora, um dia ou uma semana. Em vez de agregar dados antes ou depois de serem gravados na tabela, adicione novos valores às células de agregação na tabela.

Por exemplo, se você tem um serviço que ajuda instituições de caridade a arrecadar dinheiro, talvez queira saber a quantidade de doações on-line por dia para cada campanha, mas não precisa saber o horário exato de cada doação ou o valor por hora. Na tabela, as chaves de linha representam IDs de instituições de caridade, e você cria um grupo de colunas agregado chamado donations. Os qualificadores de coluna na linha são IDs de campanha.

À medida que cada valor de doação recebido em um determinado dia para uma campanha é recebido, ele é adicionado à soma na célula de agregação na coluna desse dia. Cada solicitação de adição para a célula usa um carimbo de data/hora truncado para o início do dia, de modo que cada solicitação tenha o mesmo carimbo de data/hora. O truncamento dos carimbos de data/hora garante que todas as doações daquele dia sejam adicionadas à mesma célula. No dia seguinte, todas as suas solicitações vão para uma nova célula, usando carimbos de data/hora truncados até a nova data, e esse padrão continua.

Dependendo do seu caso de uso, você pode criar novas colunas para seus novos agregados. Dependendo do número de buckets que você planeja acumular, considere um design de chave de linha diferente.

Para mais informações sobre intervalos de tempo, consulte Projeto de esquema para série temporal temporais.

Otimização de fluxos de trabalho

Com os agregados, você pode agrupar seus dados na tabela do Bigtable sem precisar usar nenhum software de processamento de streaming ou ETL para agregá-los antes ou depois de gravar no Bigtable. Por exemplo, se o aplicativo já publicou mensagens no Pub/Sub e usou o Dataflow para ler as mensagens e agregar os dados antes de gravar no Bigtable, você pode enviar os dados diretamente para células agregadas no Bigtable.

Grupos de colunas agregados

Para criar e atualizar células de agregação, você precisa ter uma ou mais famílias de colunas de agregação na tabela, que contêm apenas células de agregação. Você pode criar famílias de colunas de agregação ao criar uma tabela ou adicionar uma família de colunas de agregação a uma tabela que já está em uso. Ao criar a família de colunas, você especifica o tipo de agregação, como a soma.

Não é possível converter uma família de colunas que contém dados não agregados em uma família de colunas agregada. As colunas em famílias de colunas agregadas não podem conter células não agregadas, e as famílias de colunas padrão não podem conter células agregadas.

Para criar uma tabela com uma família de colunas agregadas, consulte Criar uma tabela. Para adicionar um grupo de colunas agregado a uma tabela, consulte Adicionar grupos de colunas.

Tipos de agregação

O Bigtable é compatível com os seguintes tipos de agregação:

Soma

Quando você grava um valor em uma célula de soma agregada (sum), o valor da célula é substituído pela soma do valor recém-adicionado e do valor atual da célula. O tipo de entrada aceito para somas é Int64.

Mínimo

Quando você grava um valor em uma célula de agregação mínima (min), o valor da célula é substituído pelo valor mais baixo entre o valor recém-adicionado e o valor atual da célula. O tipo de entrada aceito para min é Int64.

Máximo

Quando você grava um valor em uma célula de agregação máxima (max), o valor da célula é substituído pelo valor mais alto entre o valor recém-adicionado e o valor atual da célula. O tipo de entrada com suporte para max é Int64.

HyperLogLog (HLL)

Quando você grava um valor em uma célula agregada de HLL (inthll), o valor é adicionado a um conjunto probabilístico de todos os valores adicionados desde a redefinição mais recente. O valor da célula representa o estado desse conjunto. Para informações mais gerais sobre o algoritmo HLL, consulte HyperLogLog.

É possível ler valores de HLL usando a biblioteca Zetasketch. Para mais informações, consulte o repositório do GitHub do Zetasketch. O tipo de entrada aceito para HLL é BYTES.

Carimbos de data/hora

Uma célula agregada é definida pela chave de linha, pelo grupo de colunas, pelo qualificador de coluna e pelo carimbo de data/hora. Você usa o mesmo carimbo de data/hora sempre que adiciona dados à célula. Se você enviar um valor para a mesma chave de linha, grupo de colunas e qualificador de coluna, mas com um carimbo de data/hora diferente, uma nova célula de agregação será criada na coluna.

Todas as solicitações enviadas para uma célula agregada precisam incluir um carimbo de data/hora.

Tipo de entrada

O tipo de entrada do valor na solicitação de gravação precisa corresponder ao tipo de entrada usado para criar a família de colunas. Por exemplo, se você enviar um valor de string para um grupo de colunas configurado para Int64, a solicitação será rejeitada.

Tipo de mutação

Uma solicitação MutateRow do Bigtable inclui o tipo de mutação, que é uma mudança na tabela. Os tipos de mutação que podem ser enviados para criar e atualizar células agregadas são AddToCell e MergeToCell. Por outro lado, uma gravação não agregada envolve uma mutação SetCell. Também é possível usar mutações de exclusão para limpar o valor acumulado de uma célula.

Em uma tabela replicada, uma célula agregada converge para o mesmo valor final em todos os clusters dentro do atraso de replicação atual. O valor final é o agregado de todas as mutações AddToCell enviadas para essa célula em todos os clusters desde a última operação de exclusão ou desde a criação da célula.

As operações de agregação estão sujeitas aos mesmos limites de operações que outras mutações de tabela.

AddToCell

Para adicionar dados a uma célula agregada, como quando você incrementa um contador, envie uma mutação AddToCell em uma solicitação MutateRow. Para mais informações, consulte AddToCell na referência da API Bigtable Data.

MergeToCell

Se você quiser copiar dados entre células, use uma mutação MergeToCell. Por exemplo, para copiar o estado da célula A para a célula B, faça algo como [DeleteCell(B), MergeToCell(B)] com o valor lido da célula A. Para mais informações, consulte MergeToCell na referência da API Bigtable Data.

Exclusões

Assim como com os dados não agregados, é possível redefinir um contador ou excluir dados agregados usando as mutações da API Data. Para mais informações, consulte Mutation na referência da API Bigtable Data.

Coleta de lixo

As células agregadas são tratadas como qualquer outra célula durante a coleta de lixo: se uma célula for marcada para exclusão, a exclusão será replicada para todos os clusters na instância. Para mais informações, consulte Replicação e coleta de lixo. Se uma solicitação de adição for enviada para uma célula agregada que foi removida pela coleta de lixo, uma nova célula agregada será criada.

A seguir