2

如果我有一个点流,其中包含来自多个用 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 分钟并不重要)

4

1 回答 1

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 会更有效率。

于 2013-09-25T02:56:04.240 回答