Окно сеанса (Azure Stream Analytics)

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

На следующей схеме показан поток с рядом событий и их сопоставление с окнами сеанса с 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 Единица времени для windowsize. В следующей таблице перечислены все допустимые аргументы timeunit.

Timeunit Сокращения
day dd, d
hour hh
minute mi, n
second 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).