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