Calcite中的流式SQL
作者:Ransom0512 发布时间:[ 2017/1/19 13:40:58 ] 推荐标签:SQL Server 数据库
级联窗口(叠加窗口)
下面的查询显示了这样一个场景,返回每个记录的统计结果,但是该结果会在固定时间被重置。
SELECT STREAM rowtime,
productId,
units,
SUM(units) OVER (PARTITION BY FLOOR(rowtime TO HOUR)) AS unitsSinceTopOfHour
FROM Orders;
这种方式类似滑窗的查询,但是单调表达式发生在Partition by子句中。随着时间从10:59:59到11:00:00,Floor从10:00:00变为11:00:00,因此,一个新的分组开始产生了。sum的统一结果开始重置。
Calcite知道旧分组永远不会再次使用,因此会从内部存储中删除该分组的所有统计结果。
行组窗
使用Window语法和Over方式可以做到。
单调和准单调
这是作者在Calcite的StreamSQL中提出的概念。
如果一个列或者表达式是递增或者递减的,那么成为是单调的。
如果列或者表达式是乱序的,并且有一种机制(比如标点符号或者水印)来生成特定值永远不会被看到,那么这列或者表达式是准单调的。
概念很南理解,但是其实是要求流上的数据是全局有序的。可以是事件顺序,或者事件id的顺序。一般情况下,我们会自动为事件补齐时间。
有了这种顺序,我们能很容易实现水印这样的功能了。
流和表的说明
CREATE VIEW HourlyOrderTotals (rowtime, productId, c, su) AS
SELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR),
productId,
COUNT(*),
SUM(units)
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId;
SELECT STREAM rowtime, productId
FROM HourlyOrderTotals
WHERE c > 2 OR su > 10;
rowtime | productId
----------+-----------
10:00:00 | 30
11:00:00 | 10
11:00:00 | 40
看看上面的视图,这个是一张表还是一个流?
因为它没有使用Stream关键字,所以必然是一个关系,是一张表, 但是它是可以被转化为流的表 。你可以在流和关系的查询中使用它。
和它等价的查询还有:
WITH HourlyOrderTotals (rowtime, productId, c, su) AS (
SELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR),
productId,
COUNT(*),
SUM(units)
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId)
SELECT STREAM rowtime, productId
FROM HourlyOrderTotals
WHERE c > 2 OR su > 10;
rowtime | productId
----------+-----------
10:00:00 | 30
11:00:00 | 10
11:00:00 | 40
这种方法不限于子查询和视图, 流式SQL中的每个查询都被定义为关系查询,并且使用顶层Select子句中的Stream关键字被转换为流 。
流上的Join分为两种, 流和表的Join以及流和流的Join
流上的Join实际都是窗口和窗口的JOin,或者窗口和表的Join,本质上都是表之间的Join,因为窗口是一张表。
比如下面一个流和表之间的Join
“`sql
SELECT STREAM o.rowtime, o.productId, o.orderId, o.units,
p.name, p.unitPrice
FROM Orders AS o
JOIN Products AS p
ON o.productId = p.productId;
rowtime | productId | orderId | units | name | unitPrice
———-+———–+———+——-+ ——-+———–
10:17:00 | 30 | 5 | 4 | Cheese | 17
10:17:05 | 10 | 6 | 1 | Beer | 0.25
10:18:05 | 20 | 7 | 2 | Wine | 6
10:18:07 | 30 | 8 | 20 | Cheese | 17
11:02:00 | 10 | 9 | 6 | Beer | 0.25
11:04:00 | 10 | 10 | 1 | Beer | 0.25
11:09:30 | 40 | 11 | 12 | Bread | 100
11:24:11 | 10 | 12 | 4 | Beer | 0.25
“`
Order是流,Products是表。两个Join之后结果肯定是流,然后,因为没有窗口,所以默认情况下应该是一个仅仅保存当前数据的长度为1的窗口,当前Order数据和Products做Join。
流和流的Join如下:
SELECT STREAM o.rowtime, o.productId, o.orderId, s.rowtime AS shipTime
FROM Orders AS o
JOIN Shipments AS s
ON o.orderId = s.orderId
AND s.rowtime BETWEEN o.rowtime AND o.rowtime + INTERVAL '1' HOUR;
rowtime | productId | orderId | shipTime
----------+-----------+---------+----------
10:17:00 | 30 | 5 | 10:55:00
10:17:05 | 10 | 6 | 10:20:00
11:02:00 | 10 | 9 | 11:58:00
11:24:11 | 10 | 12 | 11:44:00
这个查询中没有显式的定义窗口,但是实际上已经通过where条件来锁定了数据范围。也是说,会自动将数据保存在一个窗口中。
DML语句
可以使用Create View语句来创建视图,上面已经可以看到,同时,也可以使用Insert AS select的方式将流上的数据导入其他流。
比如:
CREATE VIEW LargeOrders AS
SELECT STREAM * FROM Orders WHERE units > 1000;
INSERT INTO LargeOrders
SELECT STREAM * FROM Orders WHERE units > 1000;
还可以通过Upsert语句来维护窗口数据
UPSERT INTO OrdersSummary
SELECT STREAM productId,
COUNT(*) OVER lastHour AS c
FROM Orders
WINDOW lastHour AS (
PARTITION BY productId
ORDER BY rowtime
RANGE INTERVAL '1' HOUR PRECEDING)
开发计划
已经完成
· 流上的 SELECT, WHERE, GROUP BY, HAVING, UNION ALL, ORDER BY
· FLOOR和CEIL函数
· 单调性(Monotonicity)
· 禁用流式结果集
比如:
sql
> SELECT STREAM * FROM (VALUES (1, 'abc'));
ERROR: Cannot stream VALUES
未完成
· 流和流的Join
· 流和表的Join
· 基于视图的流
· 流上的包含Order by的Union ALL(流合并)
· 流上的关系型查询
· 流上的窗口聚合(滑窗和级联窗口)
· 忽略视图和子查询中的Stream关键字
· 流上的Order by不能包含Offset和Limit
· 运行时候检查是否有足够的历史记录数据来进行查询
· 准单调性–需要有一种机制,能够申明数据一旦计算完毕,不再更新,或者是计算完毕之后,如果新结果有刷新,再来更新。比如水印功能。
· HOP和TUMBLE函数,以及辅助性的HOP_START, HOP_END, TUMBLE_START, TUMBLE_END函数
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
在测试数据库性能时,需要注意哪些方面的内容?测试管理工具TC数据库报错的原因有哪些?怎么解决?数据库的三大范式以及五大约束编程常用的几种时间戳转换(java .net 数据库)优化mysql数据库的几个步骤数据库并行读取和写入之Python实现深入理解数据库(DB2)缓冲池(BufferPool)国内三大云数据库测试对比预警即预防:6大常见数据库安全漏洞数据库规划、设计与管理数据库-事务的概念SQL Server修改数据库物理文件存在位置使用PHP与SQL搭建可搜索的加密数据库用Python写一个NoSQL数据库详述 SQL 中的数据库操作详述 SQL 中的数据库操作Java面试准备:数据库MySQL性能优化
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南