【问题标题】:EPL Esper query use historical time stored in event's property instead of publish timeEPL Esper 查询使用存储在事件属性中的历史时间而不是发布时间
【发布时间】:2015-03-07 05:05:00
【问题描述】:

假设我有一个简单的对象:

public class StockTick{
    private String symbol;
    private decimal price;
    private Date date;
    private int unixTimestamp
}

我应该如何修改以下查询以使用 StockTick.date 或 StockTick.unixTimestamp 在 .win:time() 窗口内进行聚合?

select avg(price) from StockTick.win:time(30 sec) where symbol='IBM'

【问题讨论】:

  • 这样更好:select avg(price) from StockTick(symbol='IBM').win:time(30 sec)

标签: esper epl nesper


【解决方案1】:

如果事件已按 unix 时间戳排序,则无需修改查询。只需为每个事件执行此操作:

runtime.sendEvent(new CurrentTimeEvent(unixTimestamp));
runtime.sendEvent(stockTickEvent);

以上代码使用外部时间,因此禁用默认的内部系统时间。对于完全无序或不分阶段的活动,根本不要使用时间窗口,而是考虑 group-by 的样子。

【讨论】:

  • 在多线程环境中工作时有一些推荐的方法吗?这似乎不是很原子
  • 如果这种方法用于无序商品会怎样?
  • 时间总是向前的。查询会有所不同,并且可能会使用 group-by 来表示无序。对于多线程,我们使用一个线程将时间向前移动,并使用多个线程来发送不发送时间的事件。
  • 无序事件当然也可以上演和重新排序。
  • 请注意,CurrentTimeEvent 向前“跳跃”(跳过中间的任何时间),而 CurrentTimeSpanEvent 有点向前滚动时间。例如,带有“每 5 秒输出一次”的语句不会使用 TimeEvent 生成中间事件,但会使用 TimeSpanEvent 生成中间事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2023-03-03
  • 2018-04-09
  • 2015-10-13
相关资源
最近更新 更多