计算 Esper 中所有事件的自定义函数 window

Custom function to calculate on all events in an Esper window

我想知道将 window 中的所有事件公开给自定义函数的最佳或最惯用的方法是什么。以下示例是根据 Esper 在线文档中使用的股票价格样式示例构建的。


假设我们有以下 Esper 查询:

select avg(price), custom_function(price) from OrderEvent#unique(symbol)

avg(price) 部分 returns 每个交易品种的最近价格的平均值。假设我们希望 custom_function 以类似的方式工作,但它需要复杂的逻辑——每次需要结果时它都希望遍历 window 中的每个值(例如异常值检测方法可能需要这样的一种算法)。

明确地说,我要求算法类似于:

custom_function(window):
   for each event in window:
       update calculation

并且没有聪明的方法来更新计算作为事件进入或离开 window。


自定义聚合可以通过将事件推送和弹出到集合来实现此目的,但是当使用原始类型时,这会出现问题。这也感觉很浪费,因为大概 esper 已经在 window 中收集了事件,所以我们不想复制它。

Esper 文档提到了许多自定义内容的方法,例如,请参阅 this Solution Pattern。还提到的是 'pull API' 可以迭代 window 中的所有事件。


什么方法被认为是解决此类问题的最佳方法?

要同时访问所有事件,请使用 window(*)prevwindow(*)

select MyLibrary.computeSomething(window(*)) from ...

computeSomething是classMyLibrary的public静态方法(或定义一个UDF)。

要一次访问单个事件,您可以使用枚举方法。聚合方法有一个初始值和累加器 lambda。有一个扩展 API 可以扩展您也可以使用的现有枚举方法。

select window(*).aggregate(..., (value, eventitem) => ...) from ...

link to window(*) doclink to enum method aggregate doclink to enum method extension api doc