本文为您介绍如何使用实时计算滑动窗口函数。
定义
滑动窗口(HOP),也被称作Sliding Window。不同于滚动窗口,滑动窗口的窗口可以重叠。
滑动窗口有两个参数:
-
slide < size ,则窗口会重叠,每个元素会被分配到多个窗口。 -
slide = size ,则等同于滚动窗口(TUMBLE)。 -
slide > size ,则为跳跃窗口,窗口之间不重叠且有间隙。
![滑动窗口](https://static-aliyun-doc.oss-accelerate.aliyuncs.com/assets/img/zh-CN/8284359951/p34327.png)
语法
HOP函数用在group by子句中,用来定义滑动窗口。
HOP(<time-attr>, <slide-interval>,<size-interval>)
<slide-interval>: INTERVAL 'string' timeUnit
<size-interval>: INTERVAL 'string' timeUnit
说明
<time-attr>
参数必须是流中的一个合法的时间属性字段,指定为Processing Time或Event Time。
标识函数
使用滑动窗口标识函数选出窗口的起始时间或者结束时间,窗口的时间属性用于下级Window的聚合。
窗口标识函数 | 返回类型 | 描述 |
HOP_START(time-attr, size-interval)
|
TIMESTAMP |
返回窗口的起始时间(包含边界)。例如
[00:10, 00:15)
窗口,返回
00:10
。
|
HOP_END(time-attr, size-interval)
|
TIMESTAMP |
返回窗口的结束时间(包含边界)。例如
[00:00, 00:15)
窗口,返回
00:15
。
|
HOP_ROWTIME(time-attr, size-interval)
|
TIMESTAMP(rowtime-attr) |
返回窗口的结束时间(不包含边界)。例如
[00:00, 00:15)
窗口,返回
00:14:59.999
。返回值是一个rowtime attribute,即可以基于该字段做时间类型的操作,例如级联窗口,只能用在基于event time的window上。
|
示例
统计每个用户过去1分钟的单击次数,每30秒更新1次,即1分钟的窗口,30秒滑动1次。
-
测试数据
username(VARCHAR) click_url(VARCHAR) ts(TIMESTAMP) Jark http://taobao.com/xxx
2017-10-10 10:00:00.0
Jark http://taobao.com/xxx
2017-10-10 10:00:10.0
Jark http://taobao.com/xxx
2017-10-10 10:00:49.0
Jark http://taobao.com/xxx
2017-10-10 10:01:05.0
Jark http://taobao.com/xxx
2017-10-10 10:01:58.0
Timo http://taobao.com/xxx
2017-10-10 10:02:10.0
-
测试语句
CREATE TABLE user_clicks ( username VARCHAR, click_url VARCHAR, ts TIMESTAMP, WATERMARK FOR ts AS ts - INTERVAL '5' SECOND ) WITH ( 'connector' = 'datahub', CREATE TABLE tumble_output ( window_start TIMESTAMP, window_end TIMESTAMP, username VARCHAR, clicks BIGINT ) WITH ( 'connector' = 'rds', INSERT INTO tumble_output SELECT HOP_START (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), HOP_END (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), username, COUNT (click_url) user_clicks GROUP BY HOP (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), username;
-
测试结果
window_start (TIMESTAMP) window_end (TIMESTAMP) username (VARCHAR) clicks (BIGINT) 2017-10-10 10:00:00.0
2017-10-10 10:01:00.0
Jark 3 2017-10-10 10:00:30.0
2017-10-10 10:01:30.0
Jark 2 2017-10-10 10:01:00.0
2017-10-10 10:02:00.0
Jark 2 2017-10-10 10:01:30.0
2017-10-10 10:02:30.0
Jark 1 2017-10-10 10:01:30.0
2017-10-10 10:02:30.0
Timo 1 2017-10-10 10:02:00.0
2017-10-10 10:03:00.0
Timo 1