点击领取2000元阿里云代金券,付款抵现金用,云服务器69元/年限时抢>>> 点击咨询成为阿里云VIP客户享永久折扣>>>
点击领取2860元腾讯云代金券,付款抵现金用,云服务器88元/年限时抢>>> 点击成为腾讯云VIP客户享永久折扣优惠>>> 点击进入华为云最新优惠活动现场>>> 点击成为华为云VIP客户享永久折扣优惠>>>
窗口函数是一种特殊的函数,它并不在 SELECT 的投影列表中使用,而是在 GROUP BY 子句中使用。流计算 Oceanus 支持三种类型的窗口函数:TUMBLE、HOP、SESSION。
TUMBLE WINDOWTUMBLE 窗口是一个个相连但不重叠的固定周期的窗口。
语法TUMBLE(time_attr, interval)
- 其中 interval 的用法可参见 时间相关函数。
- 第一个参数表示时间戳字段,表示每条记录被处理时的时间戳。
注意:
- 如果在 Event Time 时间模式下(使用 WATERMARK FOR 语句定义了时间戳字段),那么 TUMBLE、HOP、SESSION 窗口函数的第一个参数必须为该字段。
- 如果在 Processing Time 时间模式下,则 TUMBLE、HOP、SESSION 窗口函数的第一个参数必须为 proctime() 函数生成的计算列,下文用 PROCTIME 举例,请在实际作业中替换为实际的列名。
示例TUMBLE(rowtime, INTERVAL '1' DAY)
其中 rowtime 是数据源中的时间戳字段。
TUMBLE(PROCTIME, INTERVAL '2' HOUR)
其中 PROCTIME 是自动生成的记录被处理时的时间戳。
TUMBLE 窗口的示意图:
HOP WINDOWHOP WINDOW 是一种滑动窗口,它保持窗口大小不变,每次滑动指定的时间周期,因而允许窗口之间的相互重叠。
语法HOP(time_attr, sliding_interval, window_size_interval)
示例HOP(rowtime, INTERVAL '1' HOUR, INTERVAL '1' DAY)
表示一个窗口大小为1天,滑动周期为1小时的 HOP 窗口。
HOP 窗口的示意图:
SESSION WINDOWSession Window 并非以长度来划分窗口,而是以非活跃时间来划分。例如超过30分钟不活跃(没有新数据),则之前的窗口结束,下一个来到的数据将会形成一个新窗口。
语法SESSION(time_attr, interval)
示例SESSION(rowtime, INTERVAL '12' HOUR)
SESSION 窗口的示意图:
另外,这三种窗口都有对应的辅助函数。以 TUMBLE 窗口为例(HOP、SESSION 也一样,只是前缀不同),有如下辅助函数:
- TUMBLE_START:表示 TUMBLE 窗口的起始值(包含)。示例如下:
SELECT user,
TUMBLE_START(rowtime, INTERVAL '1' DAY) as wStart,
SUM(amount) FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user
- TUMBLE_END:表示 TUMBLE 窗口的末端界限(不包含,只能用于 SELECT 后的列,不能用作 JOIN 或 GROUP 以及 OVER 条件。若需要,请根据当前的时间模式(Event Time 或 Processing Time)分别使用下面的 TUMBLE_ROWTIME 或 TUMBLE_PROCTIME)。
- TUMBLE_ROWTIME:表示 TUMBLE 窗口的末端界限(包含,可用作 JOIN 或 GROUP 以及 OVER 条件,Event Time 时间模式下使用)。示例如下:
SELECT user,
TUMBLE_START(rowtime, INTERVAL '12' HOUR) AS sStart,
TUMBLE_ROWTIME(rowtime, INTERVAL '12' HOUR) AS snd,
SUM(amount)
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '12' HOUR), user
- TUMBLE_PROCTIME:表示 TUMBLE 窗口的末端界限(包含,可用作 JOIN 或 GROUP 以及 OVER 条件,Processing Time 时间模式下使用)。示例如下:
SELECT user,
TUMBLE_START(PROCTIME, INTERVAL '12' HOUR) AS sStart,
TUMBLE_PROCTIME(PROCTIME, INTERVAL '12' HOUR) AS snd,
SUM(amount)
FROM Orders
GROUP BY TUMBLE(PROCTIME, INTERVAL '12' HOUR), user
|