Esper 非常简单的上下文和聚合
Esper very simple context and aggregation
我有一个非常简单的问题需要建模,而且我没有 Esper 方面的经验,所以我可能走错了路,所以我想了解一下。
场景如下:我有一个事件流 "ParkingEvent",有两种类型的事件 "SpotTaken" 和 "SpotFree"。所以我有一个 Esper context,它们都按 id 分区,并由 "SpotTaken" 类型的开始事件和 "SpotFree" 类型的结束事件作为边界。这个想法是用传感器监控一个停车位,然后汇总数据以计算该停车位被占用的次数以及占用的时间。
就是这样,没有时间 window 或其他任何东西,所以它看起来很简单,但我很难汇总数据。这是我目前得到的代码:
create context ParkingSpotOccupation
context PartionBySource
partition by source from SmartParkingEvent,
context ContextBorders
initiated by SmartParkingEvent(
type = "SpotTaken") as startEvent
terminated by SmartParkingEvent(
type = "SpotFree") as endEvent;
@Name("measurement_occupation")
context ParkingSpotOccupation
insert into CreateMeasurement
select
e.source as source,
"ParkingSpotOccupation" as type,
{
"startDate", min(e.time),
"endDate", max(e.time),
"duration", dateDifferenceInSec(max(e.time), min(e.time))
} as fragments
from
SmartParkingEvent e
output
snapshot when terminated;
我得到了相同的最小值和最大值数据,所以我猜我做错了什么。
当我使用 context.ContextBorders.startEvent.time 和 context.ContextBorders.endEvent.time 而不是最小值和最大值时,不会触发 measurement_occupation 语句。
鉴于您提供的 EPL 已经计算了测量结果,这将计算该地点被占用(和释放)的次数并计算总时长:
select source, count(*), sum(duration) from CreateMeasurement group by source
我有一个非常简单的问题需要建模,而且我没有 Esper 方面的经验,所以我可能走错了路,所以我想了解一下。
场景如下:我有一个事件流 "ParkingEvent",有两种类型的事件 "SpotTaken" 和 "SpotFree"。所以我有一个 Esper context,它们都按 id 分区,并由 "SpotTaken" 类型的开始事件和 "SpotFree" 类型的结束事件作为边界。这个想法是用传感器监控一个停车位,然后汇总数据以计算该停车位被占用的次数以及占用的时间。
就是这样,没有时间 window 或其他任何东西,所以它看起来很简单,但我很难汇总数据。这是我目前得到的代码:
create context ParkingSpotOccupation
context PartionBySource
partition by source from SmartParkingEvent,
context ContextBorders
initiated by SmartParkingEvent(
type = "SpotTaken") as startEvent
terminated by SmartParkingEvent(
type = "SpotFree") as endEvent;
@Name("measurement_occupation")
context ParkingSpotOccupation
insert into CreateMeasurement
select
e.source as source,
"ParkingSpotOccupation" as type,
{
"startDate", min(e.time),
"endDate", max(e.time),
"duration", dateDifferenceInSec(max(e.time), min(e.time))
} as fragments
from
SmartParkingEvent e
output
snapshot when terminated;
我得到了相同的最小值和最大值数据,所以我猜我做错了什么。
当我使用 context.ContextBorders.startEvent.time 和 context.ContextBorders.endEvent.time 而不是最小值和最大值时,不会触发 measurement_occupation 语句。
鉴于您提供的 EPL 已经计算了测量结果,这将计算该地点被占用(和释放)的次数并计算总时长:
select source, count(*), sum(duration) from CreateMeasurement group by source