Эспер: time_order похоже не работает

Я использую 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 минут)"?

Думаю проблема в конфигурации Esper, рассмотрим простой запрос:

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

Это код метода «upate» UpdateListener:

 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

Кажется, ни инструкция "заказать по" не работает, как это возможно?


person paolo789    schedule 10.10.2014    source источник


Ответы (2)


В документации говорится, что нужно выбрать rstream, так как исходящие события упорядочены, а не входящие. См. http://esper.codehaus.org/esper-5.0.0/doc/reference/en-US/html_single/index.html#view-time-order

person user650839    schedule 10.10.2014
comment
При добавлении rstream вывод такой же, есть ли способ перейти к упорядоченному событию Esper по отметке времени? - person paolo789; 11.10.2014
comment
Почему бы вам не просмотреть регрессионные тесты для time_order и не посмотреть, чем ваш код отличается от кода регрессии. Ссылка: svn.codehaus.org/esper/esper/trunk/esper/src/test/java/com/ - person user650839; 13.10.2014

Вам нужно определить какое-то ограничение по времени или длине. Ваш оператор просто возвращает все входящие события в окно 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;

Затем вы можете использовать специальные запросы к нему, и они будут возвращать события в правильном порядке (хотя вы можете добиться того же с помощью win:time(10000 minutes) и добавления order by timestamp_event к вашему специальному запросу).

person xpa1492    schedule 13.10.2014
comment
Я отредактировал начальный пост с более подробной информацией, кажется, что ни заказ по команде не работает! - person paolo789; 13.10.2014
comment
Order by не будет работать таким образом, потому что вы все еще выбираете входной поток и все равно будете получать каждое событие по мере его вставки. Попробуйте select * from Event.win:time(10 sec) order by id_event output snapshot every 10 seconds. - person xpa1492; 14.10.2014