✅ Azure 流分析 ✅ 构造事件流
窗口化提供了根据特定窗口定义在不同时间间隔内聚合事件的方法。 有四种类型的临时窗口可供选择: 翻转、 跳跃、 滑动和 会话。
Windows() 函数扩展了此概念,以同时计算多个不同窗口定义的结果。 Windows() 函数允许指定多个窗口定义。 查询逻辑针对其中每个窗口定义进行计算,结果是所有窗口结果的并集。
由于 Windows() 函数的结果包含多个窗口的组合,因此需要区分不同的结果。 为此,可将标识分配给可以使用 System.Window()系统函数访问的每个窗口。Id。System.Window() 返回 ID 作为其字段的记录。
有两种方法可以定义 Windows:
使用 Window() 函数、 Window(ID、window_definition)分配唯一标识,其中 ID 是 window_definition 的标识,是 Windows 构造中不区分大小写 的 varchar(max) 值。
没有标识,在这种情况下 ,System.Window()。ID 结果为 null 值。
语法
| Windows ( window_definition, … )
| Windows ( Window ( id , window_definition ), … )
window_definition =
| HoppingWindow ( …
| TumblingWindow ( …
| SlidingWindow ( …
| SessionWindow ( …
| Hopping ( …
| Tumbling ( …
| Sliding ( …
| Session ( …
注释
Windows 构造不能嵌套。 必须向所有窗口定义提供标识,或者必须提供给无标识。
有缩短的窗口定义名称,如“翻转”,可以在 Windows() 中使用,以避免重复单词“window”,如 in Windows(Window('MyWindow', TumblingWindow(…
. 缩短的名称也可以在 Windows 构造之外使用。
使用 System.Window 不是错误。 没有 Windows 构造的 ID,但其值将为 null,因为没有向窗口提供标识。
如果使用 Window() 函数指定了窗口定义,则所有窗口定义都必须使用 Window() 函数,并且所有不区分大小写的 ID 都必须是唯一的。 不允许为 Null。
System.Window() 函数
System.Window() 函数只能在 GROUP BY 语句的 SELECT 子句中使用,以检索有关分组时间窗口的元数据。
该函数返回一个包含单个字段 ID 的 Record 类型的值,该值保存事件所属窗口的标识。
例子
创建窗口以计算每一个持续时间为 10、20、30、40、50 和 60 分钟且没有窗口标识的汽车。
SELECT
TollId,
COUNT(*)
FROM Input TIMESTAMP BY EntryTime
GROUP BY
TollId,
Windows(
TumblingWindow(minute, 10),
TumblingWindow(minute, 20),
TumblingWindow(minute, 30),
TumblingWindow(minute, 40),
TumblingWindow(minute, 50),
TumblingWindow(minute, 60))
创建具有 1 分钟跃点和 4 个不同的持续时间的窗口 - 1 分钟、15 分钟、30 分钟和 60 分钟。
SELECT
System.Window().Id,
TollId,
COUNT(*)
FROM Input TIMESTAMP BY EntryTime
GROUP BY
TollId,
Windows(
Window('1 min', TumblingWindow(minute, 1)),
Window('15 min', HoppingWindow(minute, 15, 1)),
Window('30 min', HoppingWindow(minute, 30, 1)),
Window('60 min', HoppingWindow(minute, 60, 1)))
根据引用表中指定的窗口持续时间创建大小不同的窗口并筛选结果。
WITH HoppingWindowResults AS
(
SELECT
System.Window().Id,
TollId,
COUNT(*)
FROM Input TIMESTAMP BY EntryTime
GROUP BY
TollId,
Windows(
Window('H10', Hopping(minute, 10, 5)),
Window('H20', Hopping(minute, 20, 5)),
Window('H30', Hopping(minute, 30, 5)),
Window('H40', Hopping(minute, 40, 5)),
Window('H50', Hopping(minute, 50, 5)),
Window('H60', Hopping(minute, 60, 5)))
)
SELECT HoppingWindowResults.*
FROM HoppingWindowResults
JOIN ReferenceTable ON
HoppingWindowResults.TollId = ReferenceTable.TollId
AND HoppingWindowResults.Id = ReferenceTable.windowId