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 基于事件开始时间的固定窗口的主要内容,如果未能解决你的问题,请参考以下文章