时间窗口(windowing)
时间窗口可以在时间列上将数据按照一定规则进行分组和划分。
RisingWave 支持流处理中两种重要的时间窗口
- 滑动时间窗口(hopping windows)
- 滚动时间窗口(tumbling windows)
相信对流处理有所了解的读者应该对这两种时间窗口并不陌生,我们在这里不再赘述。简单来说只要记住这么几条:
- 滑动时间窗口有
滑动间隔
与窗口大小
两个参数,而滚动时间窗口只有窗口大小一个参数; - 滚动时间窗口是滑动时间窗口的特例;
- 滚动时间窗口相当于是
滑动间隔
与窗口大小
一致滑动时间窗口; - 滑动时间窗口允许两个相邻窗口重叠或完全不重叠,而滚动时间窗口的两个相邻窗口恰好不重叠。
在 RisingWave 中,时间窗口函数的输入和输出都是表,时间窗口需要指定输入表中的一个时间列,输出表其中每一行都包含一个时间窗的数据,和输入表的结构(schema)相比,输出表多了两个新列 window_start 和 window_end,分别指示时间窗口的开始和结束。
代码示例
假设我们有一条出租车行程数据流 taxi_trips
:
| trip_id | taxi_id | completed_at | distance | duration |
| ------- | ------- | ------------------- | -------- | -------- |
| 1 | 1001 | 2022-07-01 22:00:00 | 4 | 6 |
| 2 | 1002 | 2022-07-01 22:01:00 | 6 | 9 |
| 3 | 1003 | 2022-07-01 22:02:00 | 3 | 5 |
| 4 | 1004 | 2022-07-01 22:03:00 | 7 | 15 |
| 5 | 1005 | 2022-07-01 22:05:00 | 2 | 4 |
| 6 | 1006 | 2022-07-01 22:05:30 | 8 | 17 |
可以用滚动时间窗口获得每分钟的分组:
SELECT trip_id, taxi_id, completed_at, window_start, window_end
FROM TUMBLE (taxi_trips, completed_at, INTERVAL '2 MINUTES');
trip_id | taxi_id | completed_at | window_start | window_end
--------+-----------+-----------------------+-----------------------+---------------------
1 | 1001 | 2022-07-01 22:00:00 | 2022-07-01 22:00:00 | 2022-07-01 22:02:00
2 | 1002 | 2022-07-01 22:01:00 | 2022-07-01 22:00:00 | 2022-07-01 22:02:00
3 | 1003 | 2022-07-01 22:02:10 | 2022-07-01 22:02:00 | 2022-07-01 22:04:00
4 | 1004 | 2022-07-01 22:03:00 | 2022-07-01 22:02:00 | 2022-07-01 22:04:00
5 | 1005 | 2022-07-01 22:05:00 | 2022-07-01 22:04:00 | 2022-07-01 22:06:00
6 | 1006 | 2022-07-01 22:06:00 | 2022-07-01 22:06:00 | 2022-07-01 22:08:00
也可以用滑动时间窗口计算每分钟开始的,长度为 2 分钟的窗口内的对应统计结果。
SELECT trip_id, taxi_id, completed_at, window_start, window_end
FROM HOP (taxi_trips, completed_at, INTERVAL '1 MINUTE', INTERVAL '2 MINUTES')
ORDER BY window_start;
trip_id | taxi_id | completed_at | window_start | window_end
---------+---------+------------------------+-----------------------+--------------------
1 | 1001 | 2022-07-01 22:00:00 | 2022-07-01 21:59:00 | 2022-07-01 22:01:00
2 | 1002 | 2022-07-01 22:01:00 | 2022-07-01 22:00:00 | 2022-07-01 22:02:00
1 | 1001 | 2022-07-01 22:00:00 | 2022-07-01 22:00:00 | 2022-07-01 22:02:00
3 | 1003 | 2022-07-01 22:02:10 | 2022-07-01 22:01:00 | 2022-07-01 22:03:00
2 | 1002 | 2022-07-01 22:01:00 | 2022-07-01 22:01:00 | 2022-07-01 22:03:00
4 | 1004 | 2022-07-01 22:03:00 | 2022-07-01 22:02:00 | 2022-07-01 22:04:00
3 | 1003 | 2022-07-01 22:02:10 | 2022-07-01 22:02:00 | 2022-07-01 22:04:00
4 | 1004 | 2022-07-01 22:03:00 | 2022-07-01 22:03:00 | 2022-07-01 22:05:00
5 | 1005 | 2022-07-01 22:05:00 | 2022-07-01 22:04:00 | 2022-07-01 22:06:00
6 | 1006 | 2022-07-01 22:06:00 | 2022-07-01 22:05:00 | 2022-07-01 22:07:00
5 | 1005 | 2022-07-01 22:05:00 | 2022-07-01 22:05:00 | 2022-07-01 22:07:00
6 | 1006 | 2022-07-01 22:06:00 | 2022-07-01 22:06:00 | 2022-07-01 22:08:00
(12 rows)