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 时间戳,该时间戳必须是微秒值,精确率最高为毫秒级。Bigtable 会拒绝精确到微秒的时间戳,例如 3023483279876543。在此示例中,可接受的时间戳值为 3023483279876000。时间戳是自 Unix 纪元 1970-01-01 00:00:00 UTC 开始所经过的微秒数。

连续的物化视图

持续具体化视图是只读资源,您可以使用 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
时间/时间戳 64 位整数,表示自 Unix 纪元以来的微秒数(与 GoogleSQL 一致)
如需了解详情,请参阅 Data API 参考文档中的 编码

结构化行键

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

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

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

未强制执行的类型

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

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

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

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

后续步骤