Calcite中的流式SQL
Calcite中的流式SQL总体设计思路
总体语法应该兼容SQL,这个是和目前流处理SQL的发展趋势是一致的。
如果部分功能标准SQL中没有包含,则尽量采用业界标杆(Oracle)。比如模式匹配的功能,目前流处理中还没有针对语法达成共识,那么在设计上,就采用Oracle data warehouse的Match Recognize的方式。还有滑窗功能。
如果还有功能目前业界标杆都没有,那么就通过函数的方式拓展,翻滚窗口和跳动窗口,这两个窗口在标准SQL中都是不包含的,所以就采用了Ceil,Tumble,Hop等函数的方式来实现功能。
总体思路就是在兼容标准SQL的基础上做尽可能少的拓展,保证语义和标准SQL一致,尽最大可能减少私有化的语法。
Calcite StreamSQL说明
- 在DDL中明确定义schema是流Or表,TODO:官网没有示例,待补充
比如有三张schema:
Orders (rowtime, productId, orderId, units) - 既是表,又是流
Products (rowtime, productId, name) - 表
Shipments (rowtime, orderId) - 流 - 查询中如果包含Stream关键字,就是流式查询,如果不包含,就是表查询。表查询可以马上返回结果并结束,流式查询只会输出结果但并不结束。
比如下面一个流查询示例:
SELECT STREAM *
FROM Orders;
rowtime | productId | orderId | units
----------+-----------+---------+-------
10:17:00 | 30 | 5 | 4
10:17:05 | 10 | 6 | 1
10:18:05 | 20 | 7 | 2
10:18:07 | 30 | 8 | 20
11:02:00 | 10 | 9 | 6
11:04:00 | 10 | 10 | 1
11:09:30 | 40 | 11 | 12
11:24:11 | 10 | 12 | 4
表查询示例:
SELECT *
FROM Orders;
rowtime | productId | orderId | units
----------+-----------+---------+-------
08:30:00 | 10 | 1 | 3
08:45:10 | 20 | 2 | 1
09:12:21 | 10 | 3 | 10
09:27:44 | 30 | 4 | 2
4 records returned.
流和表的查询不能混用,否则会报错
SELECT * FROM Shipments;
ERROR: Cannot convert stream 'SHIPMENTS' to a table
SELECT STREAM * FROM Products;
ERROR: Cannot convert table 'PRODUCTS' to a stream
- 其他过滤,排序,having等操作和标准sql一致,不再举例。
- 子查询只需要在外层语句写Stream关键字即可,内层写了无效。
如:
SELECT STREAM rowtime, productId
FROM (
SELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR) AS rowtime,
productId,
COUNT(*) AS c,
SUM(units) AS su
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId)
WHERE c > 2 OR su > 10;
rowtime | productId
----------+-----------
10:00:00 | 30
11:00:00 | 10
11:00:00 | 40