Окно сеанса (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).