Azure 流分析) (会话窗口

会话窗口组事件到达类似时间,筛选出没有数据的时间段。 会话窗口函数有三个main参数:timeout、最大持续时间和分区键 (可选) 。

下图演示了一个包含一系列事件的流,以及它们如何映射到 5 分钟超时和最长持续时间为 10 分钟的会话窗口。

流分析会话窗口

第一个事件发生时,会话窗口开始。 如果在上一个引入事件后的指定超时期间内发生另一事件,那么窗口将扩展到包含该新事件。 反之,如果超时期间内没有发生事件,则窗口在超时时关闭。

如果指定超时期间内持续发生事件,则会话窗口将持续扩展,直到达到最长持续时间。 请注意,最长持续时间检查间隔设置为与指定的最大持续时间相同的大小。 例如,如果最大持续时间为 10,则检查窗口是否超过最大持续时间将发生在 t = 0、10、20、30 等位置。这意味着会话窗口的实际持续时间最多可以是 maxDuration 的两倍。

因此,在数学上,如果满足以下条件,会话窗口将结束:

会话窗口结束条件

如果提供了分区键,则事件按该键组合在一起,会话窗口将分别应用于每个组。 这适用于需要不同用户或设备的不同会话窗口的情况。

语法

{SESSIONWINDOW | SESSION} (timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]

{SESSIONWINDOW | SESSION} (Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]

注意

可以通过上述两种方式使用会话窗口。

参数

timeunit 窗口化的时间单位。 下表列出了所有有效的 timeunit 参数。

时间单位 缩写形式
day dd、d
hour hh
minute mi、n
第 2 个 ss、s
毫秒 ms
微秒 mcs

timeoutsize

一个大整数,用于描述会话窗口的间隔大小。 在间隙大小内发生的数据将分组在同一个窗口中。

maxdurationsize

如果总窗口大小超过检查点处的指定 maxDurationSize,则关闭窗口并在同一点打开一个新窗口。 目前,检查间隔的大小等于 maxDurationSize。

partitionkey

一个可选参数,指定会话窗口所针对的键。 如果指定,窗口将只将同一键的事件组合在一起。

示例

假设你具有以下 json 数据:

[
  // time: the timestamp when the user clicks on the link
  // user_id: the id of the user
  // url: the url the user clicked on
  {
    "time": "2017-01-26T00:00:00.0000000z",
    "user_id": 0,
    "url": "www.example.com/a.html"
  },
  {
    "time": "2017-01-26T00:00:20.0000000z",
    "user_id": 0,
    "url": "www.example.com/b.html"
  },
  {
    "time": "2017-01-26T00:00:55.0000000z",
    "user_id": 1,
    "url": "www.example.com/c.html"
  },
  // ...
]

若要度量每个用户会话的时长,可以使用以下查询:

CREATE TABLE localinput(time DATETIME, user_id BIGINT, url NVARCHAR(MAX))
SELECT
    user_id,
    MIN(time) AS window_start,
    System.Timestamp() AS window_end,
    DATEDIFF(s, MIN(time), System.Timestamp()) AS duration_in_seconds
FROM localinput TIMESTAMP BY time
GROUP BY user_id, SessionWindow(minute, 2, 60) OVER (PARTITION BY user_id)

前面的查询创建一个会话窗口,其超时时间为 2 分钟,最大持续时间为 60 分钟,分区键为 user_id。 这意味着将为每个user_id创建独立的会话窗口。 对于每个窗口,此查询将生成包含user_id、窗口 (window_start) 开始时间、窗口结束 (window_end) 以及用户会话总持续时间 (duration_in_seconds) 的输出。