Bigtable 中的数据类型强制执行

Bigtable 的灵活架构让您可以在 Bigtable 表中存储任何类型的数据,包括字符串、日期、数字、JSON 文档,甚至图片或 PDF。

本文档介绍了 Bigtable 何时强制执行类型,要求您在应用代码中对其进行编码或解码。如需查看 Bigtable 数据类型的列表,请参阅 Data API 参考文档中的类型。

强制执行的类型

系统会针对以下数据强制执行数据类型:

  • 汇总列族(计数器)
  • 时间戳
  • 连续的物化视图
  • 结构化行键

汇总

对于汇总数据类型,编码取决于汇总类型。创建聚合列族时,您必须指定聚合类型。

下表显示了每种聚合类型的输入类型和编码。

汇总类型 输入类型 编码
总和 Int64 BigEndianBytes
分钟 Int64 BigEndianBytes
最大值 Int64 BigEndianBytes
HLL 字节 Zetasketch HLL++

使用 SQL 查询聚合单元格中的数据时,SQL 会自动纳入类型信息。

当您使用 Data API 的 ReadRows 方法读取聚合单元格中的数据时,Bigtable 会返回字节,因此您的应用必须使用 Bigtable 用于将类型化数据映射到字节的编码来解码这些值。

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

如需详细了解如何创建具有聚合列族的表,请参阅创建表。如需查看展示如何使用编码值递增聚合单元格的代码示例,请参阅递增值。

时间戳

每个 Bigtable 单元格都有一个 Int64 时间戳,表示自 Unix 纪元 1970-01-01 00:00:00 UTC 以来经过的微秒数。

时间戳来源

Bigtable 表中的每个时间戳都有一个来源,用于指示时间戳的设置方式。Bigtable 可识别以下时间戳来源:

  • 用户指定:由您或应用设置的时间戳。
  • Bigtable 生成:由客户端库使用客户端的本地系统时钟设置的时间戳,或由服务器使用服务器的当前时间生成的时间戳。

时间戳粒度和精确度

Bigtable 支持以下级别的时间戳粒度:

  • 毫秒级粒度(默认):时间戳必须是微秒值,精确率最高为毫秒级,例如 3023483279876000。Bigtable 会拒绝用户指定的微秒级时间戳,并将 Bigtable 生成的微秒级时间戳截断为毫秒级。
  • 微秒粒度:时间戳可以具有完整的微秒精度,例如 3023483279876543。Bigtable 接受用户指定和 Bigtable 生成的时间戳,精确到微秒。

您可以在创建表时设置时间戳粒度。

时间戳限制

以下限制适用于具有微秒时间戳粒度的表:

  • 只有 2.82.0 版或更高版本的 Java 版 Bigtable 客户端库支持微秒时间戳粒度。使用其他客户端的读取或写入请求会失败。
  • 微秒级时间戳粒度仅适用于企业 Plus 版中的实例。
  • 表创建后,您无法更改其时间戳粒度。
  • 您无法在具有微秒级精度的表上创建连续物化视图。
  • 您无法在具有微秒级精度的表上创建逻辑视图。
  • 如果实例包含任何具有微秒级粒度的表,则无法将实例从企业 Plus 版降级到企业版。您必须先删除这些表,然后才能开始降级。
  • 具有微秒级粒度的表的备份只能恢复到企业 Plus 版实例。

连续的物化视图

持续物化视图是只读资源,您可以使用 SQL 或通过 ReadRows Data API 调用来读取。具体化视图中的数据根据定义它的查询进行类型化。如需查看概览,请参阅连续物化视图。

使用 SQL 查询连续具体化视图时,SQL 会自动纳入类型信息。

当您使用 Data API ReadRows 请求从持续物化视图中读取数据时,您必须了解每列的类型并在应用代码中对其进行解码。

连续具体化视图中的汇总值使用下表中所述的编码进行存储,具体取决于视图定义中列的输出类型。

类型 编码
布尔值 1 字节值,1 = true,0 = false
BYTES 无编码
INT64(或 INT、SMALLINT、INTEGER、BIGINT、TINYINT、BYTEINT) 64 位大端序
FLOAT64 64 位 IEEE 754,不包括 NaN 和 +/-inf
STRING UTF-8
TIME/TIMESTAMP 64 位整数,表示自 Unix 纪元以来的微秒数(与 GoogleSQL 一致)
如需了解详情,请参阅 Data API 参考文档中的 编码。

结构化行键

结构化行键可让您使用多列键访问数据,类似于关系型数据库中的复合键。

结构化行键的类型和编码由行键架构定义,您可以选择将该架构添加到 Bigtable 表中。结构化行键数据以字节形式存储,但当您对表执行 SQL 查询时,GoogleSQL for Bigtable 会自动使用行键架构中定义的类型和编码。

不支持使用行键架构通过 ReadRows 请求查询表。默认情况下,连续具体化视图具有行键架构。如需详细了解结构化行键,请参阅管理行键架构。

未强制执行的类型

如果未提供类型信息,Bigtable 会将每个单元格视为具有未知编码的字节。

查询在创建时未强制执行类型的列族时,您必须在读取时提供类型信息,以确保正确读取数据。这与行为取决于数据类型的数据库函数相关。GoogleSQL for Bigtable 提供 CAST 函数,用于在查询时执行类型转换。这些函数可将字节转换为各种函数所需的类型。

虽然 Bigtable 不强制执行类型,但某些操作会假定数据类型。了解这一点有助于您确保以可在数据库中处理的方式写入数据。示例如下:

  • 使用 ReadModifyWriteRow 的增量假定单元格包含 64 位大端序有符号整数。
  • SQL 中的 TO_VECTOR64 函数要求单元格包含一个字节数组,该数组是 64 位浮点数的大端序字节的串联。
  • SQL 中的 TO_VECTOR32 函数要求单元格包含一个字节数组,该数组是 32 位浮点数的大端序字节的串联。

后续步骤