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 一致) |
结构化行键
结构化行键可让您使用多列键访问数据,类似于关系型数据库中的复合键。
结构化行键的类型和编码由行键架构定义,您可以选择将该架构添加到 Bigtable 表中。结构化行键数据以字节形式存储,但当您对表执行 SQL 查询时,GoogleSQL for Bigtable 会自动使用行键架构中定义的类型和编码。
不支持使用行键架构通过 ReadRows 请求查询表。默认情况下,连续具体化视图具有行键架构。如需详细了解结构化行键,请参阅管理行键架构。
未强制执行的类型
如果未提供类型信息,Bigtable 会将每个单元格视为具有未知编码的字节。
查询在创建时未强制执行类型的列族时,您必须在读取时提供类型信息,以确保正确读取数据。这与行为取决于数据类型的数据库函数相关。GoogleSQL for Bigtable 提供 CAST 函数,用于在查询时执行类型转换。这些函数可将字节转换为各种函数所需的类型。
虽然 Bigtable 不强制执行类型,但某些操作会假定数据类型。了解这一点有助于您确保以可在数据库中处理的方式写入数据。示例如下:
- 使用
ReadModifyWriteRow的增量假定单元格包含 64 位大端序有符号整数。 - SQL 中的
TO_VECTOR64函数要求单元格包含一个字节数组,该数组是 64 位浮点数的大端序字节的串联。 - SQL 中的
TO_VECTOR32函数要求单元格包含一个字节数组,该数组是 32 位浮点数的大端序字节的串联。