Azure 流分析) (快照窗口

快照窗口将具有相同时间戳的事件分组。 与其他需要特定窗口函数(如 SessionWindow())的窗口类型不同,可以通过将 System.Timestamp() 添加到 GROUP BY 子句来应用快照窗口。

下图演示了包含一系列事件的流及其映射到快照窗口的方式。

快照窗口示意图

可以在 GROUP BY 子句中将 System.Timestamp () 视为键列或快照窗口定义,因为它根据时间戳的相等性将事件分组到窗口中。 与其他窗口函数结合使用时,System.Timestamp () 被视为键,而不是窗口定义。 System.Timestamp () 与其他窗口函数一起使用时不会产生错误,这与 GROUP BY 子句中使用多个窗口函数不同。 在 GROUP BY 中使用 System.Timestamp () 和窗口函数可用于批处理结果。

包含 System.Timestamp () 的任何表达式都不被视为窗口。 例如, GROUP BY DATEPART(minute, System.Timestamp()) 失败并出现错误“必须指定窗口”。

语法

System.Timestamp()

示例

基本示例

以下示例返回在同一时间发生的具有相同主题类型的推文计数:

SELECT Topic, COUNT(*)
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, System.Timestamp()

翻转窗口快照示例

快照窗口的常见用法是在事件通过前面的窗口函数(如下面的 TumblingWindow)按单个时间戳分组后聚合事件。

以下示例在 30 分钟的间隔内返回同一用户具有相同主题类型的推文计数:

WITH PerInterval AS (
    SELECT Topic, User, COUNT(*)
    FROM TwitterStream TIMESTAMP BY CreatedAt
    GROUP BY Topic, User, TumblingWindow(minute, 30)
)
SELECT * INTO UserTopicsCount FROM PerInterval

若要在同一时间间隔内查找每个主题的用户数和推文总数,可以使用上一个查询的结果。 由于翻转窗口结果的时间戳都与 30 分钟边界对齐,因此可以使用快照窗口在每个边界返回事件,因为它们都具有相同的时间戳值。

SELECT Topic, Users = COUNT(*), Total = SUM (count)
FROM PerInterval
GROUP BY Topic, System.Timestamp()

上一个查询在相同的 30 分钟间隔内返回每个主题的用户数和推文总数。 若要每 2 小时获取一次相同的结果,请将 2 小时的翻转窗口添加到 GROUP BY 子句。

以下查询在每个 2 小时窗口结束时返回所有 4 个 30 分钟间隔的结果。

SELECT Topic, Users = COUNT(*), Total = SUM (count)
FROM PerInterval
GROUP BY Topic, System.Timestamp(), Tumbling (hour, 2)

聚合窗口示例

可以使用 System.Timestamp () 作为聚合 Windows () 构造中的窗口之一。

SELECT 
    TollId, 
    COUNT(*) 
FROM Input TIMESTAMP BY EntryTime 
GROUP BY 
    TollId, 
    Windows(
        TumblingWindow(minute, 10),
        TumblingWindow(minute, 20),
        System.Timestamp())