会话窗口

✅ Azure 流分析 ✅ 构造事件流

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

下图演示了包含一系列事件的流,以及如何将其映射到会话时段 5 分钟超时,最大持续时间为 10 分钟。

流分析会话窗口

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

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

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

会话窗口结束条件

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

语法

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

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

注释

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

论据

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

Timeunit 缩写形式
dd、d
小时 hh
分钟 mi、 n
ss、s
毫秒 女士
微秒 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)。