Skip to main content

时间窗口(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)