Apache Calcite官方文档中文版- 进阶-3

第二部分 进阶() 3. 流()
扩展了SQL和关系代数以支持流式查询 。
3.1 简介
流是收集到持续不断流动的记录,永远不停止 。与表不同,它们通常不存储在磁盘上,而流是通过网络,并在内存中保存很短的时间 。
数据流是对表格的补充,因为它们代表了企业现在和将来发生的事情,而表格代表了过去 。一个流被存档到一个表中是很常见的 。
与表一样,您经常希望根据关系代数以高级语言查询流,根据模式()进行验证,并优化以充分利用可用的资源和算法 。
的SQL是对标准SQL的扩展,而不是另一种“类SQL”的语言 。区别很重要,原因如下:
如果不使用关键字,则返回常规标准SQL 。
3.2 示例
流式SQL使用以下:
3.3 简单查询
最简单的流式查询:
SELECT STREAM *FROM Orders;rowtime | productId | orderId | units----------+-----------+---------+-------10:17:00 |30 |5 |410:17:05 |10 |6 |110:18:05 |20 |7 |210:18:07 |30 |8 |2011:02:00 |10 |9 |611:04:00 |10 |10 |111:09:30 |40 |11 |1211:24:11 |10 |12 |4
该查询读取流中的所有列和行 。与任何流式查询一样,它永远不会终止 。只要记录到达,它就会输出一条记录 。
输入-C以终止查询 。
关键字是SQL流的主要扩展 。它告诉系统你对订单有兴趣,而不是现有订单 。
查询:
SELECT *FROM Orders;rowtime | productId | orderId | units----------+-----------+---------+-------08:30:00 |10 |1 |308:45:10 |20 |2 |109:12:21 |10 |3 |1009:27:44 |30 |4 |24 records returned.
也是有效的,但会打印出现有的所有订单,然后终止 。我们把它称为关系查询,而不是流式处理 。它具有传统的SQL语义 。
很特殊,因为它有一个流和一个表 。如果您尝试在表上运行流式查询或在流上运行关系式查询,则会抛出一个错误:
SELECT * FROM Shipments;ERROR: Cannot convert stream 'SHIPMENTS' to a tableSELECT STREAM * FROM Products;ERROR: Cannot convert table 'PRODUCTS' to a stream
3.4 过滤行
与常规的SQL中一样,使用一个WHERE子句来过滤行:
SELECT STREAM *FROM OrdersWHERE units > 3;rowtime | productId | orderId | units----------+-----------+---------+-------10:17:00 |30 |5 |410:18:07 |30 |8 |2011:02:00 |10 |9 |611:09:30 |40 |11 |1211:24:11 |10 |12 |4
3.5 表达式投影
在子句中使用表达式来选择要返回或计算表达式的列:
SELECT STREAM rowtime,'An order for ' || units || ' '|| CASE units WHEN 1 THEN 'unit' ELSE 'units' END|| ' of product #' || productId AS descriptionFROM Orders;rowtime | description----------+---------------------------------------10:17:00 | An order for 4 units of product #3010:17:05 | An order for 1 unit of product #1010:18:05 | An order for 2 units of product #2010:18:07 | An order for 20 units of product #3011:02:00 | An order by 6 units of product #1011:04:00 | An order by 1 unit of product #1011:09:30 | An order for 12 units of product #4011:24:11 | An order by 4 units of product #10
我们建议您始终在条款中包含列 。在每个流和流式查询中有一个有序的时间戳,可以在稍后进行高级计算,例如GROUP BY和JOIN 。
3.6 滚动窗口
有几种方法可以计算流上的聚合函数 。差异是:
窗口类型:
SELECT STREAM CEIL(rowtime TO HOUR) AS rowtime,productId,COUNT(*) AS c,SUM(units) AS unitsFROM OrdersGROUP BY CEIL(rowtime TO HOUR), productId;rowtime | productId |c | units------------+---------------+------------+-------11:00:00 |30 |2 |2411:00:00 |10 |1 |111:00:00 |20 |1 |712:00:00 |10 |3 |1112:00:00 |40 |1 |12
结果是流 。在11点整,发出自10点以来一直到11点有下订单的的小计 。12点,它会发出11:00至12:00之间的订单 。每个输入行只贡献到一个输出行 。