найти самое длинное событие в переворачивающемся окне

Если у меня есть поток точек с данными точек от нескольких «единиц», идентифицированных с помощью UnitId и даты начала:

var input = CepStream<EventPayload>.Create("input", typeof(SQLPayloadInputAdapterFactory), inputConfig, EventShape.Point);

и я конвертирую его в интервальный поток:

var signal = input .AlterEventDuration(e => TimeSpan.MaxValue) .ClipEventDuration(input, (e1, e2) => (e1.UnitID == e2.UnitID));

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

Что мне нужно сделать, так это запросить поток «сигнал», чтобы найти самое длинное событие в 1-минутном переворачивающемся окне.

var groupWindowQuery = from e in signal
                       group e by e.UnitID into unitGroups
                       from window in unitGroups.TumblingWindow(
                       TimeSpan.FromSeconds(60),
                       HoppingWindowOutputPolicy.ClipToWindowEnd)
                                   select new
                                   {
                                       id = unitGroups.Key,
                                       count = window.Count(),
                                   };

... Дает мне группы единиц с количеством и т. д., но я не могу получить продолжительность события для передачи другим запросам, поскольку я могу видеть только значения полезной нагрузки в groupWindowQuery.

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

Или можно установить значения в полезной нагрузке, чтобы я мог указать дату окончания событий точки при создании потока сигнала из точек?

(не имеет значения, что продолжительность будет 1 минута для событий, которые охватывают окно)


person Matt    schedule 23.09.2013    source источник


Ответы (1)


Что вам нужно сделать, так это получить продолжительность события, а затем использовать его в запросе. К сожалению, вы не можете сделать это напрямую. Но это не значит, что это невозможно сделать. :-) Вот один из вариантов: http://www.devbiker.net/post/How-long-did-that-edge-event-take.aspx. Другой вариант — использовать Edge UDSO, а не тему. Вот документы для этого: http://technet.microsoft.com/en-us/library/hh290514.aspx. Хотя в примере показан PointStreamOperator, EdgeStreamOperator работает точно так же. Если вы пойдете по этому пути, вы будете использовать конечное ребро для расчета продолжительности, а затем yield вернет результат. Из двух методов EdgeStreamOperator, вероятно, лучше; использование темы создает новую временную шкалу потока, которая вам действительно не нужна (даже если она полностью синхронизирована с источником), и UDSO будет немного более эффективным.

person DevBiker    schedule 25.09.2013
comment
Я создал UDSO, который отслеживает события в течение 1 минуты и возвращает самое длинное событие за эту минуту, но время начала события для возвращаемого «самого длинного» события имеет звездное время последнего события, обработанного UDSO, и поэтому не является временем события. самого длинного события - я считаю, что это по замыслу. - person Matt; 26.09.2013
comment
Чтобы уточнить мои требования, мне нужно вернуть самое продолжительное событие, происходящее в каждую календарную минуту, с отметкой времени, относящейся к этой минуте. То, что я получаю от UDSO, - это самое длинное событие :) с отметкой времени последнего события, которая часто намного позже самого длинного события :( - person Matt; 26.09.2013