1

使用 siddhi 3.0.3 作为 Java 库

使用带有时间窗口的 group by 时,我看到了一些意外行为。一般问题是我得到了组的正确结果聚合,但是每个事件我收到一个聚合结果,而不是每个组一个。

具体来说,

使用以下查询,没有时间窗口:

@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;

我得到每个唯一事件名称的一个结果,具有正确的计数和平均值。因此,在我的示例中,有 15 个唯一的 EventName,每个唯一的 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 的结果都是正确的,因为它具有正确的计数和平均值。但是,我得到 10 个结果,而不是每个 EventName 一个结果,总共 150 个结果。

我们希望用 Siddhi 替换 Esper,因此我通过 Esper 运行了类似的查询,并且使用 Esper,在这两种情况下,我都收到了每个 EventName 一个结果的预期输出。

4

1 回答 1

2

这可以通过使用时间批处理窗口 [1] 而不是时间窗口来排序。时间窗口是一个滑动窗口,它将从事件接收时间和触发时间向后计算窗口时间。在批处理窗口中,它将从第一个事件到达开始计算窗口,并在其过期后发送所有事件。您可以使用 WSO2 CEP 产品的 Siddhi Try it [2] 工具并使用 Siddhi 查询模拟事件。

[1] https://docs.wso2.com/display/CEP400/Inbuilt+Windows#InbuiltWindows-timeBatchtimeBatch

[2] https://docs.wso2.com/display/CEP400/Siddhi+Try+It+Tool

于 2016-02-26T11:58:55.493 回答