Окно аналитики Azure Stream

У меня возникли проблемы с оконным управлением Stream Analytics. Вход в мое задание Stream Analytics представляет собой поток событий, который содержит показания температуры от датчиков / объектов, которые принадлежат сигналу. Каждый сигнал имеет около 600 объектов. Пример события будет выглядеть следующим образом.

{
    "SignalId": "1",
    "EntityId": "1",
    "Temperature": 78   
}

Stream Analytics читает пороговые значения для каждого объекта из контрольного двоичного объекта данных, который выглядит примерно так.

 [{
     "SignalId": "1",
     "Entities": [{
         "Id": 1,
         "Threshold": 60
      }, {
          "Id": 2,
          "Threshold": 108
      }, {
          "Id": 3,
          "Threshold": 106
      }]
 }, {
     "SignalId": "2",
     "Entities": [{
         "Id": 1,
         "Threshold": 65
    }, {
        "Id": 2,
        "Threshold": 120
    }, {
        "Id": 3,
        "Threshold": 107
    }]
 }]

Я написал запрос Stream Analytics, чтобы отфильтровать событие и вставить "Тревогу" в базу данных SQL Azure, если значения температуры превышают соответствующие пороговые значения.

SELECT
    e.SignalId AS SignalId,
    e.EntityId AS EntityId,
    e.Temperature AS AttrValue,
    entities.ArrayValue.Threshold AS Threshold,
    SYSTEM.TIMESTAMP AS EventTimestamp
INTO
    output
FROM
    eventhub e
JOIN 
    referenceblob b 
ON 
    e.SignalId = b.SignalId
CROSS APPLY 
    GetElements(b.Entities) entities
WHERE
    e.EntityId = entities.ArrayValue.Id
AND
    e.Temperature > entities.ArrayValue.Threshold

Что мне сейчас нужно, так это поставить скользящее окно (я полагаю) на это. Я хочу создать "Тревогу", только если значение температуры для объекта непрерывно пересекает свой соответствующий порог в течение 1 часа. Вставленная строка должна содержать данные, относящиеся к последнему событию в окне.

Я новичок в Stream Analytics и T-SQL и, честно говоря, не совсем понимаю, как работают оконные функции. Вот мои вопросы...

  1. Если я получаю плохие события (где температура превышает пороговое значение) непрерывно в течение 30 минут, а затем получаю хорошее событие, можно ли написать запрос так, чтобы новое окно начиналось со следующего плохого события?

  2. Можно ли выбрать данные для последнего события в окне? Я попытался использовать LAST() и LAG(), но это дало мне ошибку компиляции, говорящую "Невозможно использовать GROUP BY без функции Aggregate". Проблема в том, что мне не нужна функция Aggregate, только значения последних событий.

Я застрял на этой проблеме в течение нескольких дней, и любая помощь будет принята с благодарностью.

Кроме того, это мой первый вопрос, поэтому, пожалуйста, прости мою нелюбовь

1 ответ

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

SELECT Entity, max(Reading) MaxReading INTO [YourOutputAlias] FROM [YourInputAlias] group by Entity, SlidingWindow(hour,1) having MaxReading <100

Другие вопросы по тегам