在写入时汇总值

如果您想在写入时在 Bigtable 中创建计数器或汇总数据,可以使用汇总。汇总是指 Bigtable 表单元格,用于在写入数据时汇总单元格值。当您添加新值时,聚合函数会将该值与单元格中已有的汇总值合并。其他数据库将类似功能称为分布式计数器

您可以使用 cbt CLI 和适用于 C++、Go 和 Java 的 Bigtable 客户端库读取和写入汇总值。您还可以使用 SQL 读取汇总结果。您可以使用发送包含 AddToCellMergeToCell 变更的 MutateRow 请求的方法更新汇总单元格。MergeToCell 可让您合并累加器,AddToCell 可让您添加输入。

本文档简要介绍了汇总,并介绍了如何创建汇总列族。在阅读本文档之前,您应该先熟悉 Bigtable 概览写入

何时使用汇总

如果您只关心实体的汇总数据,而不是单个数据点,Bigtable 汇总非常有用。

计数器

您可以使用汇总单元格构建计数器,并在写入时递增值,而不会受到发出 ReadModifyWriteRow 请求的限制。

如果您要从 Apache Cassandra 或 Redis 等数据库迁移到 Bigtable,则可以在之前依赖这些系统中的计数器的地方使用 Bigtable 汇总。

如需完成演示如何使用 cbt CLI 实现计数器的快速入门,请参阅创建和更新计数器

时段

您可以使用时间分桶来获取一段时间(例如一小时、一天或一周)的汇总值。您可以向表格中的汇总单元格添加新值,而不是在数据写入表格之前或之后对数据进行汇总。

例如,如果您提供帮助慈善机构筹款的服务,则可能需要了解每个活动每天的在线捐款金额,但不需要知道每次捐款的确切时间或每小时的金额。在表中,行键代表慈善机构 ID,您可以创建一个名为 donations 的汇总列族。该行中的列限定符是广告系列 ID。

当系统收到广告系列在给定日期收到的每笔捐款金额时,都会将其添加到当天该列中汇总单元格的总和中。对该单元格发出的每个添加请求都会使用截断到当天开始时间的时间戳,因此实际上每个请求都具有相同的时间戳。截断时间戳可确保当天的所有捐款都添加到同一单元格中。第二天,所有请求都会进入新的单元格,并使用截断为新日期的时间戳,这种模式会持续下去。

根据您的用例,您可以选择改为为新的汇总创建新列。根据您计划累积的分桶数量,您可以考虑采用不同的行键设计。

如需详细了解时间分桶,请参阅时序数据架构设计

简化工作流程

借助汇总功能,您可以在 Bigtable 表中汇总数据,而无需在将数据写入 Bigtable 之前或之后使用任何 ETL 或流式处理软件来汇总数据。例如,如果您的应用之前向 Pub/Sub 发布了消息,然后使用 Dataflow 读取消息并聚合数据,然后再将数据写入 Bigtable,您可以改为直接将数据发送到 Bigtable 中的汇总单元格。

汇总列族

如需创建和更新汇总单元格,您的表中必须有一个或多个汇总列族,即仅包含汇总单元格的列族。您可以在创建表时创建汇总列族,也可以向正在使用的表添加汇总列族。创建列族时,您需要指定汇总类型,例如求和。

您无法将包含非汇总数据的列族转换为汇总列族。汇总列族中的列不能包含非汇总单元格,标准列族不能包含汇总单元格。

如需创建包含汇总列族的新表,请参阅创建表。如需向表中添加汇总列族,请参阅添加列族

汇总类型

Bigtable 支持以下汇总类型:

总和

当您向求和汇总单元格 (sum) 写入值时,单元格值会替换为新添加的值与当前单元格值的总和。对和支持的输入类型为 Int64

下限

当您向最小汇总单元格 (min) 写入值时,单元格值会替换为新添加的值和当前单元格值之间的较小值。min 支持的输入类型为 Int64

最大值

当您向最大汇总单元格 (max) 写入值时,单元格值会替换为新添加的值和当前单元格值中较大的值。支持的“max”输入类型为 Int64

HyperLogLog (HLL)

当您向 HLL 汇总单元格 (inthll) 写入值时,该值会添加到自最近一次重置以来添加的所有值的概率集合中。单元格值表示该集合的状态。如需详细了解 HLL 算法,请参阅 HyperLogLog

您可以使用 Zetasketch 库读取 HLL 值。如需了解详情,请参阅 Zetasketch GitHub 代码库。HLL 支持的输入类型为 BYTES

时间戳

汇总单元格由行键、列族、列限定符和时间戳定义。每次向单元格添加数据时,您都使用相同的时间戳。如果您向相同的行键、列族和列限定符发送值,但时间戳不同,系统会在该列中创建一个新的汇总单元格。

发送到汇总单元的任何请求都必须包含时间戳。

输入类型

写入请求中值的输入类型必须与创建列族时使用的输入类型一致。例如,如果您向配置为 Int64 的列族发送字符串值,系统会拒绝该请求。

变更类型

Bigtable MutateRow 请求包含更改类型,即对表的更改。您可以发送 AddToCellMergeToCell 类型的更改来创建和更新汇总单元格。相比之下,非汇总写入涉及 SetCell 更改。您还可以使用删除更改来清除单元格的累积值。

在已复制的表中,汇总单元格会在当前复制延迟时间内在所有集群中收敛到相同的最终值。最终值是自上次删除操作或自该单元格创建以来,所有集群中发送到该单元格的所有 AddToCell 更改的汇总。

汇总操作与其他表更新操作受到相同的操作限制

AddToCell

如需向汇总单元格添加数据(例如在递增计数器时),您可以在 MutateRow 请求中发送 AddToCell 更改。如需了解详情,请参阅 Bigtable Data API 参考文档中的 AddToCell

MergeToCell

如果您想在单元格之间复制数据,请使用 MergeToCell 更改。例如,如需将状态从单元格 A 复制到单元格 B,您可以使用从单元格 A 读取的值执行 [DeleteCell(B), MergeToCell(B)] 之类的操作。如需了解详情,请参阅 Bigtable Data API 参考文档中的 MergeToCell

删除数

与非汇总数据一样,您可以使用 Data API 更改操作重置计数器或删除汇总数据。如需了解详情,请参阅 Bigtable Data API 参考文档中的更改

垃圾回收

在垃圾回收期间,汇总单元格会被视为任何其他单元格:如果某个单元格被标记为要删除,则删除操作会复制到实例中的所有集群。如需了解详情,请参阅复制和垃圾回收。如果向已被垃圾回收移除的汇总单元格发送添加请求,系统会创建新的汇总单元格。

后续步骤