2016-12-16 15 views
0

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

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

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

[{ 
    "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 
    }] 
}] 

Я написал поток Analytics Query, чтобы отфильтровать событие и вставить «Alarm» в базу данных 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 только последние значения событий.

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

Кроме того, это мой первый вопрос, поэтому, пожалуйста, простите мой noobishness

ответ

0

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

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