了解窗口函数
流处理的共同目标是将事件聚合为临时间隔或窗口。 例如,计算每分钟社交媒体发布的帖子数量,或者计算每小时的平均降雨量。
Azure 流分析包括对五种时态窗口函数的原生支持。 这些函数使你能够定义在查询中聚合数据的时态间隔。 支持的窗口函数包括翻转、跳跃、滑动、会话和快照。
翻转
翻转窗口函数将数据流划分为一系列连续的固定大小且不重叠的时段,并对其执行操作。 事件不能属于多个翻转窗口。
由以下查询表示的翻转窗口示例查找每个 1 分钟窗口中的最大读数值。 使用查询语法的 GROUP BY 子句在流分析作业中应用窗口函数。 以下查询中的 GROUP BY
子句包含 TumblingWindow()
函数,它指定 1 分钟的窗口大小。
SELECT DateAdd(minute,-1,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY TumblingWindow(minute, 1)
跳转
跳跃窗口函数为计划的重叠窗口建模,会在时间中按固定的时间段跳进。 最简单的方法是将它们视为可重叠的并且比窗口大小更频繁地发出的翻转窗口。 事实上,翻转窗口只是 hop
等于 size
的跳跃窗口。 使用跳跃窗口时,事件可以属于多个窗口结果集。
若要创建跳跃窗口,必须指定三个参数。 第一个参数指示时间单位,例如秒、分钟或小时。 以下参数设置窗口大小,该大小指定每个窗口的持续时间。 最后一个必需参数是跃程大小,它指定每个窗口相对于前一个窗口前进的量。 还可以使用可选的第四个参数来表示偏移大小。
以下查询演示了如何使用 timeunit
设置为 second
的 HoppingWindow()
。 windowsize
为 60 秒,hopsize
为 30 秒。 此查询每隔 30 秒输出一个事件,其中包含过去 60 秒发生的最大读数值。
SELECT DateAdd(second,-60,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY HoppingWindow(second, 60, 30)
滑动
滑动窗口为窗口内容实际发生更改时的时间点生成事件。 此函数模型限制了需要考虑的窗口数。 Azure 流分析只输出在事件进入或退出窗口时这些时间点的事件。 因此,每个窗口至少包含一个事件。 滑动窗口中的事件可以属于多个滑动窗口,这类似于跳跃窗口。
下面的查询使用 SlidingWindow()
函数查找发生事件的每个 1 分钟窗口中的最大读数值。
SELECT DateAdd(minute,-1,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY SlidingWindow(minute, 1)
会话
会话窗口函数将在类似时间到达的事件聚类到一起,并筛选出没有数据的时间段。 它具有三个主要参数:超时、最长持续时间和分区键(可选)。
发生第一个事件会启动会话窗口。 假设在上一个引入事件的指定超时内发生了另一个事件。 在这种情况下,窗口将会扩展以合并新事件。 但是,如果在指定的超时期限内未发生其他事件,则窗口将在超时处关闭。 如果指定超时期间内持续发生事件,则会话窗口将不断扩展,直到达到最大持续时间。
以下查询通过基于点击流数据创建 timeoutsize
为 20 秒、maximumdurationsize
为 60 秒的 SessionWindow
,来度量用户会话长度。
SELECT DateAdd(second,-60,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY SessionWindow(second, 20, 60)
快照
快照窗口按照相同的时间戳值将事件分组。 与其他窗口类型不同,不需要特定的窗口函数。 可以通过为查询的 GROUP BY
子句指定 System.Timestamp()
函数来使用快照窗口。
例如,以下查询查找在完全相同的时间发生的事件的最大读数值。
SELECT System.TimeStamp() AS WindowTime,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY System.Timestamp()
System.Timestamp()
被认为是 GROUP BY
子句中的快照窗口定义,因为它基于时间戳的相等性将事件分组到窗口中。