流分析开窗函数简介
在实时流方案中,对临时窗口中包含的数据执行操作是一种常见模式。 流分析提供对开窗函数的本机支持,使开发人员能够最小的工作量创建复杂的流进程作业。
有五种类型的时态窗口可供选择:
可在流分析作业中查询语法的 GROUP BY 子句中使用开窗函数 。 还可以使用 Windows() 函数聚合在多个窗口中聚合事件。
所有开窗操作都在窗口“结束”时输出结果 。 在启动流分析作业时,可以指定“作业输出开始时间”,系统将自动提取传入流中的先前事件,以在指定时间输出第一个窗口;例如,当你开始使用“立即”选项时,它将立即开始发出数据。 窗口的输出是基于所用聚合函数的单个事件。 该输出事件包含窗口的结束时间戳,所有窗口函数都以固定的长度定义。
翻转窗口
使用翻转窗口函数将数据流细分为不同的时间段,并对它们执行函数。
翻转窗口的主要区别是:
- 它们不会重复。
- 它们不会重叠。
- 一个事件不能属于多个翻转窗口。
下面是示例的输入数据:
戳 | CreatedAt | TimeZone |
---|---|---|
1 | 2021-10-26T10:15:01 | PST |
5 | 2021-10-26T10:15:03 | PST |
4 | 2021-10-26T10:15:06 | PST |
... | ... | ... |
下面是示例查询:
SELECT System.Timestamp() as WindowEndTime, TimeZone, COUNT(*) AS Count
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY TimeZone, TumblingWindow(second,10)
下面是示例输出:
WindowEndTime | TimeZone | 计数 |
---|---|---|
2021-10-26T10:15:10 | PST | 5 |
2021-10-26T10:15:20 | PST | 2 |
2021-10-26T10:15:30 | PST | 4 |
跳跃窗口
跳跃窗口函数在一段固定的时间内向前跳跃。 可能很容易将它们视为可以重叠且比窗口大小更频繁发出的翻转窗口。 事件可以属于多个跳跃窗口结果集。 要使跳跃窗口与翻转窗口相同,需将跃点大小指定为与窗口大小相同。
下面是示例数据:
戳 | CreatedAt | 主题 |
---|---|---|
1 | 2021-10-26T10:15:01 | 流式处理 |
5 | 2021-10-26T10:15:03 | 流式处理 |
4 | 2021-10-26T10:15:06 | 流式处理 |
... | ... | ... |
下面是示例查询:
SELECT System.Timestamp() as WindowEndTime, Topic, COUNT(*) AS Count
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, HoppingWindow(second,10,5)
下面是示例输出:
WindowEndTime | 主题 | 计数 |
---|---|---|
2021-10-26T10:15:10 | 流式处理 | 5 |
2021-10-26T10:15:15 | 流式处理 | 3 |
2021-10-26T10:15:20 | 流式处理 | 2 |
2021-10-26T10:15:25 | 流式处理 | 4 |
2021-10-26T10:15:30 | 流式处理 | 4 |
滑动窗口
滑动窗口不同于翻转或跳跃窗口,它仅在窗口内容实际更改的时间点输出事件。 换句话说,事件进入或退出窗口时。 因此,每个窗口至少有一个事件。 与跳跃窗口类似,事件可以属于多个滑动窗口。
下面是示例输入数据:
戳 | CreatedAt | 主题 |
---|---|---|
1 | 2021-10-26T10:15:10 | 流式处理 |
5 | 2021-10-26T10:15:12 | 流式处理 |
9 | 2021-10-26T10:15:15 | 流式处理 |
7 | 2021-10-26T10:15:15 | 流式处理 |
8 | 2021-10-26T10:15:27 | 流式处理 |
下面是示例查询:
SELECT System.Timestamp() as WindowEndTime, Topic, COUNT(*) AS Count
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, SlidingWindow(second,10)
HAVING COUNT(*) >=3
输出:
WindowEndTime | 主题 | 计数 |
---|---|---|
2021-10-26T10:15:15 | 流式处理 | 4 |
2021-10-26T10:15:20 | 流式处理 | 3 |
会话窗口
会话窗口函数对差不多同时到达的事件进行分组,筛掉没有数据的时间段。 它有三个主要参数:
- 超时
- 最大持续时间
- 分区键(可选)。
第一个事件发生时,会话窗口开始。 如果在上一个引入事件后的指定超时期间内发生另一事件,那么窗口将扩展到包含该新事件。 反之,如果超时期间内没有发生事件,则窗口在超时时关闭。
如果指定超时期间内持续发生事件,则会话窗口将持续扩展,直到达到最长持续时间。 最长持续时间检间隔设置为与指定最长持续时间相同。 例如,如果最长持续时间为 10,则将在 t = 0、10、20、30 等时,检查窗口是否超出最长持续时间。
如果提供了分区键,则事件按该键组合在一起,会话窗口将分别应用于每个组。 在需要将不同会话窗口用于不同用户或设备时,此分区十分有帮助。
下面是示例输入数据:
戳 | CreatedAt | 主题 |
---|---|---|
1 | 2021-10-26T10:15:01 | 流式处理 |
2 | 2021-10-26T10:15:04 | 流式处理 |
3 | 2021-10-26T10:15:13 | 流式处理 |
... | ... | ... |
下面是示例查询:
SELECT System.Timestamp() as WindowEndTime, Topic, COUNT(*) AS Count
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, SessionWindow(second,5,10)
输出:
WindowEndTime | 主题 | 计数 |
---|---|---|
2021-10-26T10:15:09 | 流式处理 | 2 |
2021-10-26T10:15:24 | 流式处理 | 4 |
2021-10-26T10:15:31 | 流式处理 | 2 |
2021-10-26T10:15:39 | 流式处理 | 1 |
快照窗口
快照窗口对具有相同时间戳的事件进行分组。 与其他需要特定窗口函数(如 SessionWindow())的窗口类型不同,可以通过将 System.Timestamp() 添加到 GROUP BY 子句来应用快照窗口。
下面是示例输入数据:
戳 | CreatedAt | 主题 |
---|---|---|
1 | 2021-10-26T10:15:04 | 流式处理 |
2 | 2021-10-26T10:15:04 | 流式处理 |
3 | 2021-10-26T10:15:04 | 流式处理 |
... | ... | ... |
下面是示例查询:
SELECT System.Timestamp() as WindowEndTime, Topic, COUNT(*) AS Count
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, System.Timestamp()
下面是示例输出:
WindowEndTime | 主题 | 计数 |
---|---|---|
2021-10-26T10:15:04 | 流式处理 | 4 |
2021-10-26T10:15:10 | 流式处理 | 2 |
2021-10-26T10:15:13 | 流式处理 | 1 |
2021-10-26T10:15:22 | 流式处理 | 2 |
后续步骤
请参阅以下文章: