Неверное поведение окна сеанса Azure Stream Analytics - PullRequest
3 голосов
/ 12 марта 2019

В моем задании Azure Stream Analytics я хочу создать окно для каждого устройства (при получении данных для устройства). Я использую окно сеанса, чтобы поддерживать отдельное окно для каждого устройства. Я хочу оповещать о нарушении температурного порога каждые 5 минут, но иногда поведение отличается. ниже мой ASA JOB запрос

SELECT
t1.DeviceId,MIN(t1.Temperature)MinTemperature,     
MAX(t1.Temperature)MaxTemperature,t2.ThresholdLimit,System.Timestamp as 
EventProcessedUtcTime,t3.EventProcessedUtcTime as LastAlertTime
,MIN(CAST(t1.MessageTime AS DateTime)) AS Window_start,
System.Timestamp AS Window_end,Count(t1.DeviceId)EventCount
INTO
[alertOutputsb]
FROM
[tsfInput] t1
INNER JOIN [device-threashold-Input] t2
ON t1.DeviceId = t2.DeviceId
LEFT OUTER JOIN [temperature-alerts-sql-Input] t3
ON t1.DeviceId = t3.DeviceId   
WHERE t1.Temperature >= Cast(t2.ThresholdLimit as float)      
GROUP BY t1.DeviceId,t2.ThresholdLimit,t3.EventProcessedUtcTime, 
SESSIONWINDOW(minute, 4, 5) OVER (PARTITION BY t1.DeviceId)
HAVING MIN(t1.Temperature) >= Cast(t2.ThresholdLimit as float)
AND MAX(t1.Temperature) >= Cast(t2.ThresholdLimit as float)

InputJSON Я отправляю данные устройства каждые 1 минуту.

{
"DeviceId": "9327848923ABE",
"Temperature": 300.5,
"MessageTime": "2019-03-02T05:50:05.362Z"
}

выход enter image description here

Для устройства - 9327848923ABE Я получил первое оповещение через 10 минут, после этого все оповещения за 5 минут.

1 Ответ

0 голосов
/ 24 марта 2019

Azure Stream Analytics - это способ управления окнами сеансов:

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

Следующая диаграмма иллюстрирует поток с серией событий и то, как они отображаются в окна сеанса продолжительностью 5 минут,и максимальная продолжительность 10 минут.

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

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

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

Окно сеанса Stream Analytics 5 минут ожидания и максимум 10 минут

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

Вот синтаксис :

SESSIONWINDOW(timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]

SESSIONWINDOW(Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]

Пояснение:

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

Это очень просто, просто начните с самого начала, если вы застряли.

...