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) 的输出。