Windows (Azure 流分析)

窗口化提供了一种根据特定窗口定义在不同时间间隔内聚合事件的方法。 有四种类型的临时窗口可供选择: 翻转跳跃滑动会话

Windows () 函数扩展了此概念,以同时计算多个不同窗口定义的结果。 Windows () 函数允许指定多个窗口定义。 查询逻辑针对其中每个窗口定义进行计算,结果是所有窗口结果的并集。

由于 Windows () 函数的结果包含多个窗口的组合,因此需要区分不同的结果。 这是通过为每个窗口分配一个标识来完成的,该标识可以使用系统函数 System.Window () 进行访问。IdSystem.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 构造不能嵌套。 必须向所有窗口定义提供标识,或者向任何窗口定义提供标识。

有缩短的窗口定义名称,如“Tumbling”,可在 Windows () 中使用,以避免重复单词“window”(如 中的 Windows(Window('MyWindow', TumblingWindow(…)。 缩短的名称也可以在 Windows 构造之外使用。

使用 System.Window () 不是错误。没有 Windows 构造的 ID,但其值将为 null,因为没有向窗口提供标识。

如果使用 Window () 函数指定窗口定义,则所有窗口定义都必须使用 Window () 函数,并且所有不区分大小写的 ID 都必须是唯一的。 不允许为 Null。

System.Window () 函数

System.Window () 函数只能在 GROUP BY 语句的 SELECT 子句中使用,以检索有关分组时间窗口的元数据。

函数返回 Record 类型的值,其中包含单个字段 ID,其中包含事件所属窗口的标识。

示例

创建窗口,用于对无窗口标识的 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))) 

创建不同大小的窗口,并根据 Reference 表中指定的窗口持续时间筛选结果。

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  

另请参阅