Окно сеанса

✅ Поток событий Azure Stream Analytics ✅ Fabric

События группы сеансов, поступающие в аналогичное время, отфильтровывают периоды времени, в которых нет данных. Функция окна сеанса имеет три основных параметра: время ожидания, максимальная длительность и ключ секционирования (необязательно).

На следующей схеме показан поток с рядом событий и их сопоставление с окнами сеанса в течение 5 минут и максимальной продолжительности 10 минут.

Окно сеанса Stream Analytics

Окно сеанса начинается при возникновении первого события. Если другое событие происходит в течение указанного времени ожидания от последнего приема события, окно расширяется, чтобы включить новое событие. В противном случае, если события не происходят в течение времени ожидания, окно закрывается во время ожидания.

Если события продолжаются в течение указанного времени ожидания, окно сеанса будет продолжать расширяться до достижения максимальной длительности. Обратите внимание, что для интервалов проверки максимальной длительности задан тот же размер, что и указанная максимальная длительность. Например, если максимальная длительность составляет 10, то проверки, если окно превышает максимальную длительность, произойдет в t = 0, 10, 20, 30 и т. д. Это означает, что фактическое время окна сеанса может быть до двухкратного максимального значенияDuration.

Таким образом, математически окно сеанса заканчивается, если выполняется следующее условие:

Окно окончания

Если указан ключ секции, события группируются вместе по этому ключу, и окно сеанса применяется к каждой группе независимо. Это полезно для случаев, когда вам нужны разные окна сеансов для разных пользователей или устройств.

Синтаксис

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

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

Замечание

Окно сеанса можно использовать двумя способами.

Аргументы

timeunit Единица времени для окна. В следующей таблице перечислены все допустимые аргументы timeunit.

Timeunit Аббревиатуры
день дд, д
час Чч
минута mi, n
секунда ss, s
миллисекунда мс
микросекунда mcs

время ожидания

Большое целое число, описывающее размер пробела в окне сеанса. Данные, происходящие в пределах размера пробела, группируются в одном окне.

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).