✅ 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)。