了解窗口函数
流处理的一个常见目标是将事件聚合成时间间隔,或窗口。 例如,计算每分钟社交媒体帖子的数量或计算每小时的平均降雨量。
Azure 流分析包括对五种时态窗口函数的原生支持。 通过这些函数,可以定义在查询中聚合数据的时态间隔。 支持的开窗函数是 翻转、 跳跃、 滑动、 会话和 快照。
翻转
翻滚窗口函数将数据流分段成连续的固定大小、非重叠时间段系列,并对其进行操作。 事件不能属于多个翻转窗口。
由以下查询表示的翻转窗口示例查找每个 1 分钟窗口中的最大读数值。 使用查询语法的 GROUP BY 子句在流分析作业中应用窗口函数。
GROUP BY以下查询中的子句包含函数TumblingWindow(),该函数指定一分钟窗口大小。
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 的跳跃窗口。 使用跳跃窗口时,事件可以属于多个窗口结果集。
若要创建跳跃窗口,必须指定三个参数。 第一个参数指示时间单位,例如秒、分钟或小时。 以下参数设置窗口大小,该大小指定每个窗口的持续时间。 最后一个必需参数是跃程大小,它指定每个窗口相对于前一个窗口前进的量。 还可以使用表示偏移大小的可选第四个参数。
以下查询演示如何使用HoppingWindow(),其中timeunit已被设置为second。 为 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() 函数在发生事件的每一分钟窗口中查找最大读取值。
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)
会话
会话 窗口功能将相似时间到达的事件聚集到一起,过滤掉没有数据的时间段。 它具有三个主要参数:超时、最大持续时间和分区键(可选)。
第一个事件的出现会启动会话窗口。 假设在上次摄入事件的指定的超时时间内发生了另一个事件。 在这种情况下,将扩展窗口以合并新事件。 但是,如果在指定的超时时间内没有发生其他事件,窗口将在超时后关闭。 如果事件在指定的超时范围内发生,会话窗口将延长,直到达到最大持续时间。
以下查询通过基于点击流数据创建 SessionWindow 为 20 秒、timeoutsize 为 60 秒的 maximumdurationsize,来度量用户会话长度。
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)
快照
快照 窗口按相同的时间戳值对事件进行分组。 与其他窗口类型不同,不需要特定的窗口函数。 可以通过为查询的 System.Timestamp() 子句指定 GROUP BY 函数来使用快照窗口。
例如,以下查询查找恰好同时发生的事件的最大读取值。
SELECT System.TimeStamp() AS WindowTime,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY System.Timestamp()
System.Timestamp() 被视为 GROUP BY 子句中的快照窗口定义,因为它是通过时间戳的相等性将事件分组到窗口中。