在翻滚窗口找到最长的事件

时间:2013-09-23 17:02:32

标签: c# complex-event-processing streaminsight

如果我有一个包含来自几个单位的点数据的点流'用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));

当输出适配器读取时,我可以获得信号流中事件的持续时间,因为这可以看到事件对象并读取其开始和结束值。

我需要做的是查询信号&#39;在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分钟并不重要)

1 个答案:

答案 0 :(得分: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的工作方式相同。如果你走这条路线,你会使用结束边来计算持续时间,然后收益返回结果。 在这两种方法中,EdgeStreamOperator可能更好;使用主题创建一个您真正不需要的新流时间轴(即使它与源完全同步),UDSO会更有效率。