Beam ZetaSQL 词法结构

Beam ZetaSQL 支持标准 SQL 标量数据类型,以及包括数组、映射和嵌套行在内的扩展。此页面记录了 Beam ZetaSQL 中支持的 ZetaSQL 数据类型。

数据类型属性

下表包含数据类型属性以及每个属性适用的数据类型

属性描述适用范围
可空NULL 是一个有效值。所有数据类型,以下情况除外
  • ARRAY 不能为 NULL
  • NULL ARRAY 元素不能持久化到表中。
  • 查询无法处理 NULL ARRAY 元素。
可排序可以在 ORDER BY 子句中使用。所有数据类型,以下情况除外
  • ARRAY
  • STRUCT
可分组通常可以出现在以下表达式之后
GROUP BYDISTINCTPARTITION BY
但是,PARTITION BY 表达式不能包含
浮点数类型 FLOATDOUBLE


所有数据类型,以下情况除外
  • ARRAY
  • STRUCT
  • FLOAT64
可比较相同类型的值可以相互比较。所有数据类型,以下情况除外

不支持 ARRAY 比较。



STRUCT 的相等比较按字段顺序逐字段支持。字段名称将被忽略。不支持小于和大于比较。





所有支持比较的类型都可以在 JOIN 条件中使用。有关联接条件的说明,请参阅 联接类型

数值类型

数值类型包括整数类型和浮点数类型。

整数类型

整数是没有小数部分的数值。

名称存储大小范围
INT648 字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

浮点数类型

浮点数是带有小数部分的近似数值。

名称存储大小描述
FLOAT648 字节双精度 (近似) 十进制值。

布尔类型

名称描述
BOOL布尔值用关键字 TRUEFALSE 表示(不区分大小写)。

字符串类型

名称描述
STRING可变长度字符 (Unicode) 数据。

输入 STRING 值必须为 UTF-8 编码,输出 STRING 值将为 UTF-8 编码。其他编码,如 CESU-8 和 Modified UTF-8 不被视为有效的 UTF-8。

所有对 STRING 值进行操作的函数和运算符都作用于 Unicode 字符而不是字节。例如,当函数 SUBSTRLENGTH 应用于 STRING 输入时,这些函数计算 Unicode 字符,而不是字节。比较定义在 Unicode 字符上。小于和 ORDER BY 的比较按字符逐个比较,较低的 Unicode 代码点被视为较低的字符。

字节类型

名称描述
BYTES可变长度二进制数据。

STRING 和 BYTES 是不同的类型,不能互换使用。STRING 和 BYTES 之间的强制转换强制执行字节使用 UTF-8 编码。

时间戳类型

注意:SQL 的 TIMESTAMP 精度为毫秒。如果 TIMESTAMP 字段具有亚毫秒精度,SQL 将抛出 IllegalArgumentException

名称描述范围
TIMESTAMP表示一个绝对的时间点,具有毫秒精度。0001-01-01 00:00:00 到 9999-12-31 23:59:59.999 UTC。

时间戳表示一个绝对的时间点,独立于任何时区或约定,如夏令时。

规范格式

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDD]][time zone]

时区用于解析时间戳或格式化时间戳以供显示。时间戳值本身不存储特定时区。字符串格式的时间戳可能包含时区。如果未明确指定时区,则使用默认时区 UTC。

时区

时区使用以下两种规范格式之一的字符串表示

相对于协调世界时 (UTC) 的偏移量

偏移量格式
(+|-)H[H][:M[M]]
Z
示例
-08:00
-8:15
+3:00
+07:30
-7
Z

使用此格式时,时区与时间戳的其余部分之间不允许有空格。

2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z

时区名称

时区名称来自 tz 数据库。有关不太全面但更简单的参考,请参阅维基百科上的 tz 数据库时区列表

格式
continent/[region/]city
示例
America/Los_Angeles
America/Argentina/Buenos_Aires

使用时区名称时,名称与时间戳的其余部分之间需要空格

2014-09-27 12:30:00.45 America/Los_Angeles

请注意,即使在一年中的某个时间段内,并非所有时区名称都是可互换的,即使它们恰好报告了相同的时间。例如,America/Los_Angeles 在夏令时期间与 UTC-7:00 报告相同的时间,但在夏令时以外期间与 UTC-8:00 报告相同的时间。

如果未指定时区,则使用默认时区值。

闰秒

时间戳只是从 1970-01-01 00:00:00 UTC 开始的偏移量,假设每分钟正好有 60 秒。闰秒不作为存储时间戳的一部分表示。

如果您的输入包含在秒字段中使用 “:60” 来表示闰秒的值,则该闰秒在转换为时间戳值时不会被保留。相反,该值将被解释为在下一分钟的秒字段中为 “:00” 的时间戳。

闰秒不影响时间戳计算。所有时间戳计算都是使用 Unix 风格的时间戳完成的,这些时间戳不反映闰秒。闰秒只能通过测量实际时间的函数来观察。在这些函数中,当出现闰秒时,时间戳秒可能被跳过或重复。

数组类型

名称描述
ARRAY零个或多个任何非 ARRAY 类型的元素的有序列表。

ARRAY 是零个或多个非 ARRAY 值元素的有序列表。不允许使用 ARRAY 的 ARRAY。生成 ARRAY 的 ARRAY 的查询将返回错误。相反,必须使用 SELECT AS STRUCT 结构在 ARRAY 之间插入 STRUCT。

空 ARRAY 和 NULL ARRAY 是两个不同的值。ARRAY 可以包含 NULL 元素。

声明 ARRAY 类型

ARRAY 类型使用尖括号 (<>) 声明。ARRAY 元素的类型可以任意复杂,但 ARRAY 不能直接包含另一个 ARRAY。

格式

ARRAY<T>

示例

类型声明含义
ARRAY<INT64>简单的 64 位整数 ARRAY。
ARRAY<STRUCT<INT64, INT64>>一个 STRUCT 的 ARRAY,每个 STRUCT 包含两个 64 位整数。
ARRAY<ARRAY<INT64>>
(不支持)
这是一个无效的类型声明,这里只是为了防止您查找如何创建多级 ARRAY。ARRAY 不能直接包含 ARRAY。相反,请参阅下一个示例。
ARRAY<STRUCT<ARRAY<INT64>>>64 位整数的 ARRAY 的 ARRAY。请注意,两个 ARRAY 之间有一个 STRUCT,因为 ARRAY 不能直接包含其他 ARRAY。

结构类型

名称描述
STRUCT包含有序字段的容器,每个字段都具有类型(必需)和字段名称(可选)。

声明 STRUCT 类型

STRUCT 类型使用尖括号 (<>) 声明。STRUCT 元素的类型可以是任意复杂的。

格式

STRUCT<T>

示例

类型声明含义
STRUCT<INT64>一个简单的 STRUCT,包含一个未命名的 64 位整数字段。
STRUCT<x STRUCT<y INT64, z INT64>>一个 STRUCT,包含一个名为 x 的嵌套 STRUCT。STRUCT x 有两个字段,yz,它们都是 64 位整数。
STRUCT<inner_array ARRAY<INT64>>一个 STRUCT,包含一个名为 inner_array 的 ARRAY,它保存 64 位整数元素。

STRUCT 的有限比较

STRUCT 可以使用等式运算符直接比较

注意,这些直接等式比较会按顺序比较 STRUCT 的字段,而忽略任何字段名称。如果您想比较 STRUCT 中名称相同的字段,可以将各个字段直接进行比较。