#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