esper 基于事件开始时间的固定窗口

Posted

技术标签:

【中文标题】esper 基于事件开始时间的固定窗口【英文标题】:esper fixed window based on event starting time 【发布时间】:2015-03-02 07:07:41 【问题描述】:

我正在使用 Esper 来聚合我的传感器数据。 数据可能以任何间隔到达,即 1 秒到 120 秒。 每个数据点都包含 TimeStamp 和 Value。

我想要 30 分钟窗口中的最小时间戳、最大时间戳、平均值和数据点计数。 30 分钟窗口的起点和终点是固定的,即 01:00 am 到 01:30 am、01:30 am 到 02:00 am 等

如何使用 Esper 实现这一点?

【问题讨论】:

我正在使用 Java POJO 和 EPL。 在 EPL 中有一个 crontab 计时器。它就像在 Unix crontab 中一样工作。我认为这个 crontab 是“*/30, *, *, *, *”。链接是esper.codehaus.org/esper-5.1.0/doc/reference/en-US/html_single/… 【参考方案1】:

外部定时批处理窗口 (win:ext_timed_batch) 应该适合您。 但我认为它可以从 Esper 4.8.0 获得 http://esper.codehaus.org/esper-4.8.0/doc/reference/en-US/html_single/index.html#view-win-ext-time-batch

【讨论】:

【参考方案2】:

要么

win:ext_timed_batch(TimeStamp.withTime(TimeStamp.getHourOfDay(), cast(TimeStamp.getMinuteOfHour()/30, int) * 30, 0, 0).toMillisec(),30 min)

或者

win:ext_timed_batch(TimeStamp.toMillisec() -(TimeStamp.toMillisec()%1800000), 30 分钟) 其中 1800000 是 30 分钟的毫秒数(30*60*1000)

【讨论】:

【参考方案3】:

所以例如参见“4​​.2.7.3. Crontab Context Condition”:

create context Every30Min start (*/30, *, *, *, *) end after 30 min; context Every30Min select count(*) from MyEvent output snapshot when terminated;

【讨论】:

这个cron是基于系统时间的,数据中的时间戳可能会延迟(由于网络或其他原因),并且它会根据时区有不同的时间戳。 cron 通常基于时间(而不是系统时间)。它基于您可以通过外部计时器控制的任何时间,但您喜欢它。 如果您有延迟数据,您可以使用“group by”并在 group by 表达式中计算一个 30 分钟的存储桶。

以上是关于esper 基于事件开始时间的固定窗口的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中如何固定窗口大小

图解数据计算中的窗口概念

图解数据计算中的窗口概念

基于固定日期间隔大小的移动窗口在R中改变新列

flink窗口的种类及详述

WeifenLuo.WinFormsUI.Docking工具栏停靠组件有没有子窗口固定的事件?