我想知道将窗口中的所有事件公开给自定义函数的最好或最惯用的方法是什么。以下示例是根据Esper在线文档中使用的股价样式示例构建的。
假设我们有以下Esper查询:
select avg(price), custom_function(price) from OrderEvent#unique(symbol)
avg(price)
部分返回每个交易品种的最新价格的平均值。假设我们希望custom_function
以类似的方式工作,但是它需要复杂的逻辑-它将希望在每次需要结果时都对窗口中的每个值进行迭代(例如,异常检测方法可能需要这种算法)。
要清楚,我要求算法看起来像:
custom_function(window):
for each event in window:
update calculation
并且没有聪明的方法可以在事件进入或离开窗口时更新计算。
自定义聚合可以通过将事件推送和弹出到集合来实现此目的,但是当使用基本类型时,这将成为问题。这也感觉很浪费,因为esper可能已经在窗口中收集了事件集合,因此我们不希望重复该事件。
Esper文档提到了许多自定义内容的方法,例如,请参见this Solution Pattern。还提到了“ pull API”可以迭代窗口中的所有事件。
哪种方法最适合解决此类问题?
您可以使用枚举方法。聚合方法具有初始值和累加器λ。有一个扩展API可以扩展您还可以使用的现有枚举方法。
select window(*).aggregate(..., (value, eventitem) => ...) from ...