写入时的汇总值
如果您希望在写入时聚合 Bigtable 中的数据,可以使用聚合。汇总是 Bigtable 表单元格,可在写入数据时对单元格的值进行汇总。当您添加新值时,聚合函数会将该值与单元格中已有的聚合值合并。其他数据库将类似功能称为计数器或分布式计数器。
Bigtable 提供的聚合类型为 sum。当您向汇总的汇总单元格添加值时,单元格的值会替换为新添加的值与当前单元格值的总和。
在预览版期间,您可以使用 cbt
CLI 以及适用于 C++、Go 和 Java 的 Bigtable 客户端库处理聚合。
本文档简要介绍了汇总,展示了如何创建汇总列族,并提供了说明如何向汇总单元格添加值的示例。在阅读本文档之前,您应该先熟悉 Bigtable 概览和写入。
何时使用汇总
当您关心的是实体数据的汇总而非作为单独的数据点时,Bigtable 聚合非常有用。如果您要从 Apache Cassandra 或 Redis 等数据库迁移到 Bigtable,则可以在之前依赖于这些系统中计数器的位置使用 Bigtable 聚合。
时段
您可以使用时间段获取一段时间(例如一小时、一天或一周)的聚合值。您可以添加新值来汇总表中的单元格,而不是在数据写入表之前或之后汇总数据。
例如,如果您运营了一项帮助慈善机构筹款的服务,您可能想要知道每个广告系列每天的在线捐款金额,但您不需要知道每次捐款的确切时间或每小时的金额。在您的表中,行键表示慈善机构 ID,您需要创建一个名为 donations
的汇总列族。该行的列限定符是广告系列 ID。
我们收到广告系列某一天收到的每笔捐款后,系统会将该金额与当天列的汇总单元格中的总和相加。该单元的每个添加请求使用的时间戳截断到一天的开始,因此实际上每个请求都具有相同的时间戳。截断时间戳可确保当天的所有捐款都添加到同一单元格中。第二天,您的所有请求都会进入新单元,并使用截断到新日期的时间戳,并且这种模式会持续出现。
根据您的使用场景,您可以选择为新聚合创建新列。根据您计划累积的分桶数量,您可以考虑不同的行键设计。
如需详细了解时间段,请参阅时序数据的架构设计。
简化工作流程
借助聚合,您可以在将数据写入 Bigtable 之前或之后聚合 Bigtable 表中的数据,而无需使用任何 ETL 或流处理软件来聚合数据。例如,如果您的应用之前将消息发布到 Pub/Sub,然后使用 Dataflow 读取消息并汇总数据,然后再将数据写入 Bigtable,则可以改为直接发送数据以聚合 Bigtable 中的单元格。
汇总列族
如需创建和更新汇总单元,您的表中必须有一个或多个汇总列族(即仅包含汇总单元格的列族)。您可以在创建表时创建这些列,也可以向已在使用的表添加汇总列族。创建列族时,您需要指定聚合类型,例如求和。
您无法将包含非汇总数据的列族转换为汇总列族。汇总列族中的列不能包含非汇总单元格,而标准列族不能包含汇总单元格。
如需使用汇总列族创建新表,请参阅创建表。如需将聚合列族添加到表中,请参阅添加列族。
汇总类型
Bigtable 支持聚合类型 sum
。求和支持的输入类型为 Int64
。
时间戳
聚合单元格由行键、列族、列限定符和时间戳定义。每次向单元格添加数据时,您都使用相同的时间戳。如果您向同一行键、列族和列限定符发送一个值,但发送时间戳不同,则该列中会创建一个新的汇总单元格。
发送到汇总单元格的添加请求必须包含时间戳。
输入类型
添加请求中值的输入类型必须与用于创建列族的输入类型相匹配。例如,如果您将字符串值发送到为 Int64
配置的列族,则请求会被拒绝。
AddToCell
添加请求在 Bigtable Data API 中发送一项 AddToCell
变更。相比之下,非汇总写入请求会发送 SetCell
变更。如需了解详情,请参阅 Data API 参考文档。
AddToCell
操作受与其他表变更相同的操作限制约束。
在复制表中,聚合单元会在当前复制延迟时间内收敛所有集群中的同一总值。总值是自上次删除操作或创建单元格以来所有集群中发送到该单元格的所有 AddToCell
变更的汇总。
添加请求示例
以下示例展示了如何向汇总单元格添加值。这些示例在需要输入类型 Int64
的列族中添加总和。
cbt
cbt addtocell TABLE_ID ROW_KEY
FAMILY_NAME:COLUMN_QUALIFER=VALUE@TIMESTAMP
请替换以下内容:
TABLE_ID
:表的永久标识符ROW_KEY
:行键FAMILY_NAME
:聚合列族的名称COLUMN_QUALIFIER
:列的标识符VALUE
:要添加到单元格的值TIMESTAMP
:以微秒为单位的 Unix 时间戳,例如1710868850000000
示例:
cbt addtocell mobile-data device-1 updates:week12=100@1710868850000000
Go
如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库。
如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库。
如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。