查询语句
平台支持标准 SQL。具体的SQL语法请参阅参考。 下面介绍一部分功能的使用。
1. 时间旅行
时间旅行(Time Travel)允许在定义的时间段内(默认7天)的任何时间点访问历史数据(即已经更改或删除的数据)。
例如下面示例表示查询2020/10/10(含)之前的数据:
select * from student(t<=20201010)
基于时间旅行,也可以提示平台访问指定时间点之后的数据,用于缩小元数据的访问范围和加速查询。
例如下面示例提示平台需要查询感兴趣数据在当前时间的2天之内:
select * from student(d<=2)
注意当使用时间旅行提示平台查询某个时间点之后的数据可能返回更多的数据,这是因为某个操作可能既包含这个时间点之后的数据
也包含这个时间点之前的数据,所以这个提示不能取代WHERE条件。
时间旅行支持的条件参数包括:
- v(version): 代表版本号,支持'=', 例如v=10代表以版本10查询指定的表。
- t(time): 代表时间, 支持'='、'>'、'>='、'<'和'<=', 值是 'YYYYMMDDHHmmssSSS'的前缀(分别精确到年、月、日、小时、分、秒部分)。例如 t=201802 表示2018年2月份的第一个毫秒到2018年2月份的最后一个毫秒。 t>201802是指从2018年3月的第一个毫秒开始。
- d(days): 代表距离当前时间的天数, 支持'>'、'>='、'<'和'<=',值只能是正整数。例如 d<=10 表示从当前时刻算10天之内(精度ms)。
- s(seconds): 代表距离当前时间的秒数, 支持'>'、'>='、'<'和'<=',值只能是正整数。例如 s<=100 表示从当前时刻算100秒之内(精度ms)。
时间旅行的条件参数可以组合起来,并通过","分隔。例如 t>=201802,t<=201804 表示2018年2月至4月。
在查询的时候平台会从元数据中查找这个时间区间相关的所有提交的操作。
您可以通过Java SDK提交操作(Commit或Streaming)并指定该操作的数据时间区间, 请参阅 Java SDK 的 submitCommit 和 submitStreaming 函数。
2. 嵌套结构
除了基础的数据类型, 算场也支持复杂的嵌套类型, 包括 STRUCT, ARRAY, MAP 类型。
可以使用 . 或 [] 访问嵌套字段:
CREATE TABLE t1(a struct<a1: int, a2: int>, b int);
# 使用 . 访问嵌套字段
SELECT a.a1 FROM t1;
SELECT a.* FROM t1;
# 使用 [] 访问嵌套字段
SELECT a["a1"] FROM t1;
可以使用 struct 创建新的嵌套字段
SELECT struct(a1 as a3) as c FROM t1;
使用 explode() 函数从 ARRAY 和 MAP 类型列解包值。
# 解 ARRAY 列时, 每一个值都会成为输出的一行
SELECT explode(array_name) AS column_name FROM table_name;
# 解 MAP 列时,每个键和对应的值会成为输出的一行
SELECT explode(map_name) AS (column1_name, column2_name) FROM table_name;