快照窗口

✅ Azure 流分析 ✅ 构造事件流

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

下图演示了一个包含一系列事件的流,以及如何将其映射到快照窗口。

快照窗口关系图

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

任何包含 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())