Переход на Azure Stream Analytics из StreamInsight

Я использую StreamInsight для CEP в течение нескольких месяцев и заинтересован в переходе на ASA. У меня есть вопрос, на который я не могу ответить из документации ASA. В StreamInsight я могу изменить продолжительность события, чтобы создать потоки сигналов из дискретных событий в определенный момент времени. Например.

var mySignal = from s in myEventStream
                .AlterEventDuration(s => TimeSpan.MaxValue)
                .ClipEventDuration(myEventStream, (s, e) => s.DeviceId == e.DeviceId && s.EventCode == e.EventCode && s.Value != e.Value)
                .ShiftEventTime(e => TimeSpan.FromTicks(1))
                where s.EventCode == "512"
                join e in myEventStream on s.DeviceId equals e.DeviceId
                select new
                    {
                       DeviceId = s.DeviceId,
                       EventCode = s.EventCode,
                       Start = s.Timestamp,
                       End = e.Timestamp,
                       Duration = e.Timestamp - s.Timestamp,
                       Value = s.Value
                    };

Что я пытаюсь сделать, так это обнаружить перекрытие между этим сигналом высокого/низкого типа и другим потоком событий на определенный момент времени. Как я могу добиться того же в ASA?

Справочная информация. У меня есть устройства, которые отправляют события из нескольких источников в концентратор событий Azure. Некоторые из этих событий являются событиями включения/выключения контактов. Каждый тип контакта представлен «Кодом события», а поле «Значение» указывает, является ли контакт открытым или закрытым. Я ищу запрос ASA, который сообщит мне, когда EventCode 512 находится в состоянии «Включено» в то же время, когда EventCode X также находится в состоянии «Включено».

Решение

Ниже приведен модифицированный код от @Andrew, который обнаруживает, что контакт закрыт, а переключатель открыт. 'inStream' определяется в операторе WITH с отметкой времени в поле Timestamp:

SELECT
    SwitchOpen.DeviceId,
    SwitchOpen.Timestamp,
    '511' AS [EventCode],
    'Switch is Open' AS [EventDescription],
    SwitchOpen.Value,
    SwitchOpen.LocationCode
INTO [outStream]
FROM
    [inStream] AS SwitchOpen
    INNER JOIN [inStream] AS ContactClosed
    ON SwitchOpen.DeviceId = ContactClosed.DeviceId
    AND DateDiff(second, SwitchOpen, ContactClosed) BETWEEN 1 AND 3600
    LEFT JOIN [inStream] AS SwitchClosed
    ON SwitchOpen.DeviceId = SwitchClosed.DeviceId
    AND SwitchClosed.EventCode = SwitchOpen.EventCode
    AND SwitchClosed.Value != SwitchOpen.Value
    AND DateDiff(second, SwitchOpen, SwitchClosed) BETWEEN 1 AND 3600
    AND DateDiff(second, SwitchClosed, ContactClosed) BETWEEN 1 AND 3600
WHERE
SwitchOpen.Value = 0.0
AND SwitchOpen.EventCode = '256'
AND ContactClosed.Value = 1.0
AND ContactClosed.EventCode = '512'
AND SwitchClosed.Timestamp IS NULL

person Graeme Wilson    schedule 08.12.2015    source источник
comment
Мы в состоянии понять это?   -  person Andrew Moll    schedule 11.12.2015
comment
Привет @AndrewMoll - спасибо за ответ! Я был отвлечен другими делами, так что извините за задержку с ответом. Я получил ваш код для анализа, но он не возвращает никаких результатов. Я получу возможность рассмотреть его подробно в середине недели.   -  person Graeme Wilson    schedule 14.12.2015


Ответы (1)


У меня нет ваших данных для уточнения, но этот формат должен делать то, что вы ищете.

SELECT
    DeviceOn.Time AS StartFault,
    Device2On.Time AS Endfault,
    DATEDIFF(second, DeviceOn.Time, Device2On.Time) AS FaultDuraitonSeconds
    DeviceOn.ID ,
    DeviceOn.EventCode,
    DeviceOn.Value
FROM
    Input AS DeviceOn TIMESTAMP by Time
    INNER JOIN Input as Device2On TIMESTAMP by Time on DeviceOn.DeviceId equals Device2On.DeviceId
    ON DATEDIFF(Second, DeviceOn, Device2On) BETWEEN 1 AND 3600
    INNER JOIN Input AS Device2Off TIMESTAMP BY Time
    ON DATEDIFF(second, DeviceOn , Device2Off ) BETWEEN 1 AND 3600
    AND DATEDIFF(second, Device2Off , DeviceOn) BETWEEN 1 AND 3600
    LEFT JOIN Input AS DeviceOff TIMESTAMP BY Time
    ON DATEDIFF(second, DeviceOn , DeviceOff ) BETWEEN 1 AND 3600
    AND DATEDIFF(second, DeviceOff , DeviceOn ) BETWEEN 1 AND 3600
WHERE
DeviceOn.Value = "On"
AND Device2On.Value =Null

Аналогично примеру запроса: определение длительности условия здесь https://azure.microsoft.com/en-us/documentation/articles/stream-analytics-stream-analytics-query-patterns/

person Andrew Moll    schedule 09.12.2015