使用siddhi 3.0.3作为Java库
在使用带有时间窗口的分组时,我看到了一些意外行为。一般的问题是我得到了组的正确结果聚合,但是每个事件我收到一个聚合结果,而不是每个组一个。
具体地,
使用以下查询,没有时间窗口:
@info(name = 'RealTimeQuery') from MyEventStream
select EventName as EventName, count() as Count, avg(ElapsedTime) as Avg_ElapsedTime
group by EventName output snapshot every 30 seconds insert into CEP_Result;
每个唯一的EventName我得到一个结果,具有正确的计数和平均值。因此,在我的示例中,有15个唯一的EventNames,每个唯一的EventName发生10次,总共150个事件。我得到15个结果,每个EventName一个,每个都有10个计数和正确的平均值,正如我所期望的那样。
但是,如果我为此查询添加时间窗口:
@info(name = 'RealTimeQuery') from MyEventStream#window.time(2 minutes)
select EventName as EventName, count() as Count, avg(ElapsedTime) as Avg_ElapsedTime
group by EventName output snapshot every 30 seconds insert into CEP_Result;
每个EventName的结果都是正确的,因为它具有正确的计数和平均值。但是,而不是每个EventName的一个结果,我得到10,总共150个结果。
我们正在寻找用Siddhi替换Esper,所以我通过Esper运行类似的查询,在Esper中,在这两种情况下,我都收到了每个EventName的一个结果的预期输出。
答案 0 :(得分:2)
可以使用时间批处理窗口[1]而不是时间窗口对其进行排序。时间窗口是一个滑动窗口,因为它将从事件接收时间和触发器向后计算窗口时间。在批处理窗口中,它将从第一个事件到达时计算窗口,并在其到期后发送所有事件。您可以使用Siddhi试用它[2] WSO2 CEP产品工具并使用Siddhi查询模拟事件。
[1] https://docs.wso2.com/display/CEP400/Inbuilt+Windows#InbuiltWindows-timeBatchtimeBatch