StreamInsight - проблема определения правильного окна - PullRequest
0 голосов
/ 27 мая 2011

Я начал использовать StreamInsight и использую его как сервис wcf.Я уже пытался обратиться за помощью в « Руководство автостопом по Microsoft StreamInsight Queries » и пробовал примеры, а также примеры в codeplex.

Моя проблема заключается в следующем:

Мой источник событий передает адаптеру AlertEvent:

public sealed class AlertEvent
{
    public DateTime Date { get; set; }
    public long IDGroup { get; set; }
    public bool IsToNormalize { get; set; }
    public bool IsError { get; set; }
}

Когда AlertEvent имеет IsError = false, флаг IsToNormalize имеет значение true;

Поведение, которого я пытаюсь достичь, - это когда я получаю поток с IsError, я хочу посмотреть, поступит ли в следующие 'x' минуты какой-либо alertEvent с IsToNormalize.Затем я отправляю на выход IsError AlarmEvent, который начал поиск.

Что я сделал, когда получил вход, соответствующий фильтру, я продлил его время жизни в 'x' минутах и ​​создал TumblingWindowчтобы увидеть, если в этот период прибывает другое AlertEvent с другим флагом (используя ExtensionMethod для перебора всех полезных нагрузок в окне).

var stream= from item in input
            where item.IsError
            group item by item.IdGroup into eachGroup
            from window in eachDigital.AlterEventDuration(e => TimeSpan.FromMinutes((double)1.5)).TumblingWindow(TimeSpan.FromSeconds(15), HoppingWindowOutputPolicy.ClipToWindowEnd)
            select new
            {
                Id = eachDigital.Key,
                NormEvents = window.HasNormalizationEvents(),
                Count = window.Count()
            };

Затем, чтобы получить AlarmEvent, который вызвал TumblingWindow, ясделал соединение с оригинальным вводом.

var resultStream = from e1 in stream
                   join e2 in input
                   on e1.Id equals e2.DigitalTag
                   where e1.NormEvents != 0
                   select e2;

Это совсем не работает ...: / Есть идеи, которые помогут решить эту проблему?

Еще одно сомнение, если у меня есть, еслибудет создано новое окно с новой startDate для каждого входа, который проходит фильтр, или будет создано только одно tumblingWindow.

Спасибо.

1 Ответ

2 голосов
/ 27 мая 2011

Попробуйте это:

// Move all error events
// to the point where the potential timeout would occur.
var timedOut = input
                   .Where(e => e.IsError == true)
                   .ShiftEventTime(e => e.StartTime + TimeSpan.FromMinutes(5));

// Extend all events IsToNormalize by the timeout.
var following = input
                   .Where(e => e. IsToNormalize == true)
                   .AlterEventDuration(e => TimeSpan.FromMinutes(5));

// Mask away the potential timeout events by the extended events.
// - If IsToNormalize did not occur within the timeout, then the shifted error event
// will remain unchanged by the left-anti-semi-join and represent
// the desired output.
var result = from t in timedOut
             where (from c in following
                    where t.IdGroup == c.IdGroup
                    select c).IsEmpty()
             select t; // or some projection on t
...