StreamInsight — Проблема с определением правильного окна

#sql-server-2008-r2 #streaminsight

#sql-server-2008-r2 #streaminsight

Вопрос:

Я начал использовать StreamInsight и использую его как службу wcf. Я уже пытался обратиться за помощью в «Руководство автостопщика по запросам Microsoft StreamInsight» и попробовал приведенные примеры, а также примеры в 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, которое запустило поиск.

Что я сделал, так это то, что когда я получаю входные данные, соответствующие фильтру, я продлеваю срок его службы на ‘x’ минут и создаю TumblingWindow, чтобы посмотреть, поступит ли в этот период другое оповещение с другим флагом (используя 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()
            };
  

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

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

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

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

Спасибо.

Комментарии:

1. @Mitch Wheat: Зачем вам такой стимул, чтобы помочь другому человеку? Если вы не хотите помогать, то не делайте этого. Я не вижу проблемы…

2. @Megacan : всем нужны стимулы.

Ответ №1:

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

 // 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