FlinkSQL中的窗口函数

更新时间:2023-06-11 21:29:34 阅读: 评论:0

FlinkSQL中的窗⼝函数
1 OVER窗⼝
OVER窗⼝(OVER Window)是传统数据库的标准开窗,不同于GROUP BY Window,OVER Window中的每⼀个元素都对应⼀个窗⼝。窗⼝元素是与当前元素相邻的元素集合,流数据元素分布在多个窗⼝中。在Flink SQL Window的实现中,每个触发计算的元素所确定的⾏,都是该元素所在窗⼝的最优⼀⾏。
在应⽤OVER Window的流式数据中,每⼀个元素都对应⼀个OVER Window。每⼀个元素都触发⼀次数据计算。在实时计算的底层实现中,OVER Window的数据进⾏全局同⼀管理(数据只存储⼀份),逻辑上为每⼀个元素维护⼀个OVER Window,为每⼀个元素进⾏窗⼝计算,完成计算后会清楚过期的数据。
1.1 语法
SELECT
agg1(col1)OVER(definition1)AS colName,
...
aggN(colN)OVER(definition1)AS colNameN
FROM Tab1;
注意:① agg1到aggN所对应的OVER definition1必须相同;② 外层SQL可以通过AS的别名查询数据。
1.2 类型
Flink SQL中对OVER Window的定义遵循标准SQL的定义语法,传统的OVER Window没有对其进⾏更细粒度的窗⼝类型命名划分。按照计算⾏的定义⽅式,OVER Window可以分为以下两类:
① ROWS OVER Window:每⼀⾏元素都被视为新的计算⾏,即每⼀⾏都是⼀个新的窗⼝;
② RANGE OVER Window:具有相同时间值的所有元素⾏视为同⼀计算⾏,即具有相同时间值的所有⾏都是同⼀个窗⼝。
1.3 属性
正交属性说明Proctime Eventtime
rows按照实际元素的⾏确定窗⼝⽀持⽀持
range按照实际的元素值(时间戳值)确定窗⼝⽀持⽀持
1.4 Rows OVER Window
(1)窗⼝数据
ROWS OVER Windows的每个元素都确定⼀个窗⼝。ROWS OVER Window分为Unbounded(⽆界流)和Bounded(有界流)两种情况。
Unbounded ROWS OVER Window数据⽰例如下图所⽰。
虽然上图所⽰窗ur1的w7、w8及ur2的窗⼝w3、w4都是同⼀时刻到达,但它们仍然在不同的窗⼝,这⼀点与RANGE OVER Window不同。
Bounded ROWS OVER Window数据以3个元素(2 PRECEDING)的窗⼝为例,如下图所⽰。
虽然上图所⽰窗⼝ur1的w5、w6及ur2的窗⼝w2、w3都是同⼀时刻到达,但它们仍然在不同的窗⼝,这⼀点与RANGE OVER Window不同。
(2)窗⼝语法
SELECT
agg1(col1)OVER(
[PARTITION BY(value_expression1,..., value_expressionN)]
圣诞快乐的英文怎么写
ORDER BY timeCol
frp
ROWS
BETWEEN(UNBOUNDED|rowCount)PRECEDING AND CURRENT ROW)AS colName,...
FROM Tab1;
① value_expression:分区值表达式。
② timeCol:元素排序的时间字段。
③ rowCount:定义根据当前⾏开始向前追溯⼏⾏元素。
输出在当前商品上架之前同类的3个商品中的最⾼价格。
SELECT
itemID,
itemType,
onSellTime,
price,
MAX(price)OVER(
find my friendsPARTITION BY itemType
ORDER BY onSellTime
ROWS BETWEEN2preceding AND CURRENT ROW)AS maxPrice
FROM tmall_item;
1.5 RANGE OVER Window
(1)窗⼝数据
RANGE OVER Window所有具有共同元素值(元素时间戳)的元素⾏确定⼀个窗⼝,RANGE OVER Window分为Unbounded和Bounded的两种情况。
Unbounded RANGE OVER Window数据⽰例如下图所⽰。
上图所⽰窗⼝ur1的w7、ur2的窗⼝w3,两个元素同⼀时刻到达,属于相同的window,这⼀点与ROWS OVER Window不同。      Bounded RANGE OVER Window数据,以3秒中数据(INTERVAL ‘2’ SECOND)的窗⼝为例,如下图所⽰。
上图所⽰窗⼝ur1的w6、ur2的窗⼝w3,元素都是同⼀时刻到达,属于相同的window,这⼀点与ROWS OVER Window不同。(2)窗⼝语法
SELECT
agg1(col1)OVER(
[PARTITION BY(value_expression1,..., value_expressionN)]
ORDER BY timeCol
RANGE
BETWEEN(UNBOUNDED| timeInterval)PRECEDING AND CURRENT ROW)AS colName,nostalgia
...
FROM Tab1;
① value_expression:进⾏分区的字表达式。
② timeCol:元素排序的时间字段。
特朗普国会演讲③ timeInterval:定义根据当前⾏开始向前追溯指定时间的元素⾏。
求⽐当前商品上架时间早2分钟的同类商品中的最⾼价格。
SELECT
itemID,
itemType,
onSellTime,
price,
MAX(price)OVER(
PARTITION BY itemType
ORDER BY onSellTime
RANGE BETWEEN INTERVAL'2'MINUTE preceding AND CURRENT ROW)AS maxPrice
FROM tmall_item;
2 分组窗⼝
2.1 分组窗⼝的类型
SQL查询的分组窗⼝是通过GROUP BY⼦句定义的。类似于使⽤常规GROUP BY语句的查询,窗⼝分组语句的GROUP BY⼦句中带有⼀个窗⼝函数为每个分组计算出⼀个结果。以下是批处理和流出理表⽀持的分组窗⼝函数:
(1)TUMBLE(time_attr, interval)
定义⼀个滚动窗⼝。滚动窗⼝把⾏分配到有固定持续时间(interval)的不重叠的连续窗⼝。⽐如,5分钟的滚动窗⼝以5分钟为间隔对⾏进⾏分组。滚动窗⼝可以定义在事件时间(批处理、流处理)或处理时间(流处理)上。
(2)HOP(time_attr, interval, interval)
定义⼀个跳跃窗⼝(在Table API中成为滑动窗⼝)。滑动窗⼝有⼀个固定的持续时间(第⼆个interval参数)以及⼀个滑动的间隔(第⼀个interval参数)。若滑动间隔⼩于窗⼝的持续时间,滑动窗⼝则会出现重叠;因此,⾏将会被分配到多个窗⼝中。⽐如,⼀个⼤⼩为15分钟的滑动窗⼝,其滑动间隔为5分钟,将会把每⼀⾏数据分配到3个15分钟的窗⼝中。滑动窗⼝可以定义咋事件时间(批处理、流处
理)或处理时间(流处理)上。
(3)SESSION(time_attr, interval)
旧约
定义⼀个会话时间窗⼝。会话时间窗⼝没有⼀个固定的持续时间,但是它们的边界会根据interval所定义的不活跃时间所确定;即⼀个会话时间窗⼝在定义的间隔时间内没有新纪录出现,该窗⼝会被关闭。例如时间窗⼝的间隔时间是30分钟,当其不活跃的时间达到30分钟后,若观测到新的记录,则会启动⼀个新的会话时间窗⼝(否则该⾏数据会被添加到当前的窗⼝),且若在30分钟内没有观测到新纪录,这个窗⼝将会被关闭。会话时间窗⼝可以使⽤事件时间(批处理、流处理)或处理时间(流处理)。
2.2 时间属性
在流处理表中的SQL查询中,分组窗⼝函数的time_attr参数必须引⽤⼀个合法的时间属性,且该属性需要指定⾏的处理时间或事件时间。
对于批处理的SQL查询,分组窗⼝函数的time_attr参数必须是⼀个TIMESTAMP类型的属性。
2.3 选择分组窗⼝的开始和结束时间戳(辅助函数)
(1)返回相对应的滚动、滑动和会话窗⼝的开始时间(包含边界)
TUMBLE_START(time_attr,interval)
HOP_START(time_attr,interval,interval)
SESSION_START(time_attr,interval)
(2)返回相对应的滚动、滑动和会话窗⼝的结束时间(包含边界)
TUMBLE_END(time_attr,interval)
HOP_END(time_attr,interval,interval)
SESSION_END(time_attr,interval)
注意:返回的间戳不可以在随后基于事件的操作中,作为⾏时间属性使⽤,⽐如基于事件窗⼝的join以及分组窗⼝或分组窗⼝上的聚合。
(3)返回相对应的滚动、滑动和会话窗⼝的结束时间(不包含边界)
TUMBLE_ROWTIME(time_attr,interval)
HOP_ROWTIME(time_attr,interval,interval)
SESSION_ROWTIME(time_attr,interval)
英语培训返回的是⼀个可⽤于后续需要基于时间的操作的时间属性(rowtime attribute),⽐如基于时间窗⼝的join以及分组窗⼝或分组窗⼝上的聚合。
angry什么意思(4)返回相对应的滚动、滑动和会话窗⼝的结束时间(不包含边界)
TUMBLE_PROCTIME(time_attr,interval)
HOP_PROCTIME(time_attr,interval,interval)
SESSION_PROCTIME(time_attr,interval)sage
返回处理时间参数可⽤于后续需要基于事件的操作,⽐如基于时间窗⼝的join以及分组窗⼝或分组窗⼝上的聚合。
注意:辅助函数必须使⽤与GROUP BY⼦句中的分组窗⼝函数完全相同的参数来调⽤。
2.4 实战
以下的例⼦展⽰了如何在流处理表中指定使⽤分组庄⼝函数的SQL查询。
(1)计算每⽇的 SUM(amount)(使⽤事件时间)
SELECT ur,
TUMBLE_START(rowtime,INTERVAL ‘1’ DAY)as wStart,
SUM(amount)FROM Orders
GROUP BY TUMBLE(rowtime,INTERVAL ‘1’ DAY),ur;
2015年高考试卷
(2)计算每⽇的SUM(amount)(使⽤处理时间)
SELECT ur,
SUM(amount)FROM Orders
GROUP BY TUMBLE(proctime,INTERVAL ‘1’ DAY),ur;
(3)使⽤事件时间计算过去24⼩时中每⼩时的 SUM(amount)
SELECT product,SUM(amount)
FROM Orders
GROUP BY HOP(rowtime,INTERVAL ‘1’ HOUR,INTERVAL ‘1’ DAY),product;
(4)计算每个以12⼩时(事件时间)作为不活动时间的会话的SUM(amount)
SELECT ur,
SESSION_START(rowtime,INTERVAL ‘12’ HOUR)as sStart,
SESSION_ROWTIME(rowtime,INTERVAL ‘12’ HOUR)as snd,
SUM(amount)
FROM Orders
GROUP BY SESSION(rowtime,INTERVAL ‘12’ HOUR),ur;
3 总结
本章主要是对Flink SQL中的窗⼝进⾏了介绍。窗⼝让我们可以很⽅便地解决⼀些实际应⽤中产⽣的问
题。但是,我觉得我对其掌握的熟练程度不⾼,有时候,换了⼀个场景,可能反应不到⽤哪个类型的窗⼝会更好⼀些。后续,我会勤加练习,多了解其在不同场景下的应⽤。

本文发布于:2023-06-11 21:29:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/932425.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:时间   元素   计算   分组
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图