0

我正在使用 Esper(事件处理引擎),EPL 查询是:

select * from Event.ext:time_order(timestamp_event, 10000 minutes) where duration > 10

但输出不是按“timestamp_event”排序的:

id int = 1, timestamp_event= 1412686800000, duration = 30
id int = 4, timestamp_event= 1412685900000, duration = 70
id int = 2, timestamp_event= 1412688600000, duration = 45
id int = 3, timestamp_event= 1412689500000, duration = 60
id int = 5, timestamp_event= 1412636400000, duration = 15

为什么“time_order(timestamp_event, 10000 minutes)”指令不起作用?

我认为问题出在 Esper 配置上,让我们考虑一个简单的查询:

select * from Event.win:time(10 sec) order by id_event

这是 UpdateListener 的“upate”方法的代码:

 public void update(EventBean[] newEvents, EventBean[] oldEvents) {
     EventBean event = newEvents[0];
     System.out.println("id int = " + event.get("id_event") + ", timestamp_event = " +  ((Long)event.get("timestamp_event")).toString());

但是输出不是由“id_event”排序的!

id event = 1, timestamp_event = 1412686800000
id event = 4, timestamp_event = 1412687700000
id event = 2, timestamp_event = 1412687100000
id event = 3, timestamp_event = 1412687400000
id event = 5, timestamp_event = 1412688000000

似乎“order by”指令都不起作用,这怎么可能?

4

2 回答 2

0

文档说选择 rstream 作为离开的事件是有序的,而不是事件进入。请参阅http://esper.codehaus.org/esper-5.0.0/doc/reference/en-US/html_single/index.html#view-time-order

于 2014-10-10T19:05:16.013 回答
0

您需要定义某种时间或长度约束。您的语句只是将所有输入事件返回到 time_order 窗口。

例如,这样的语句会以正确的顺序为您提供所有事件,每 1 分钟一次:

select * from Event.ext:time_order(timestamp_event, 10000 minutes)
where duration > 10 output snapshot every 1 minute

或者,您可以定义一个数据窗口并将事件插入其中,如下所示:

create window OrderedEvents.ext:time_order(timestamp_event, 10000 minutes) as select * from Event;
insert into OrderedEvents select * from Event;

然后,您可以对它使用临时查询,它们将以正确的顺序返回事件(尽管您可以使用 a 实现相同的目的,并将 awin:time(10000 minutes)添加order by timestamp_event到临时查询中)。

于 2014-10-13T09:33:27.233 回答