如果我有一个包含来自几个单位的点数据的点流'用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分钟并不重要)
答案 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会更有效率。