0

我有一个非常简单的问题要建模,而且我在 Esper 方面没有经验,所以我可能会走错路,所以我想要一些见解。

这是场景:我有一个事件流“ParkingEvent”,有两种类型的事件“SpotTaken”和“SpotFree”。所以我有一个 Esper上下文,既按 id 分区,又以“SpotTaken”类型的开始事件和“SpotFree”类型的结束事件为边界。这个想法是用传感器监控停车位,然后汇总数据以计算停车位被占用的次数以及时间占用。

就是这样,没有时间窗口或任何东西,所以看起来很简单,但我很难聚合数据。这是我到目前为止得到的代码:

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 而不是 min 和 max 时,不会触发 measure_occupation 语句。

4

1 回答 1

0

鉴于您提供的 EPL 已经计算了测量值,这会计算该点被占用(和释放)的次数并总计持续时间:

select source, count(*), sum(duration) from CreateMeasurement group by source
于 2016-06-30T16:26:46.000 回答