Esper输出说明

时间:2016-10-07 12:02:02

标签: esper

考虑以下事件流和上下文定义:

create schema EventCreated(
    source String,
    type String,
    time String,
    value Integer
);

create context Trip
    context bySource
        partition by source from EventCreated,

    context byEvents
        initiated by EventCreated(
            type = "IgnitionOn") as startEvent

        terminated by EventCreated(
            type = "IgnitionOff") as endEvent;

我希望,当我的上下文结束时,选择是开始和结束日期,也就是说分别来自startEvent和endEvent的“time”属性。

我的第一次尝试是:

context Trip
    select
        context.byEvents.startEvent.time as startTime,
        context.byEvents.endEvent.time as endTime

    from
        EventCreated e

    output
        snapshot when terminated;

然而,当我尝试它时,我所得到的只是一个“空”的声明:

At: 2016-10-07 10:20:00.000
Statement: Stmt-3

经过几次尝试,我意识到如果我没有从EventCreated中选择任何东西,输出总是为空的,例如,如果我这样做:

context Trip
    select
        avg(e.value) as averageValue,
        context.byEvents.startEvent.time as startTime,
        context.byEvents.endEvent.time as endTime

    from
        EventCreated e

    output
        snapshot when terminated;

然后我确实得到了一个非空的结果(当然有相同的事件传入):

At: 2016-10-07 10:20:00.000
Statement: Stmt-3
Insert
Stmt-3-output={averageValue=3.0, startTime='2016-10-07T10:00:00.000', endTime=(null)}

所以,我的第一个问题就是这个问题:如果我不想从事件中选择任何东西,只在结束时从上下文本身中选择任何东西,我会使用什么语法?快照是错误的关键字吗?有没有办法只从上下文而不是事件流中选择一些东西?

另外,正如您所看到的,虽然我可以从我的“启动”事件(在我的上下文声明中由“发起者”声明的事件)中检索数据,但我永远无法从“终止”事件中检索数据。我在这里做错了吗?

我知道我可以这样做:

context Trip
    select
        context.byEvents.startEvent.time as startTime,
        e.time as endTime

    from
        EventCreated e

    output
        last when terminated;

但我真的很想知道我的语法有什么问题,因为它感觉正确。

1 个答案:

答案 0 :(得分:0)

“输出快照”与“iterate()”结果相同。 “from EventCreated”不保留任何事件,因此“iterate()”结果为空。您正在寻找的是所有事件,所以“来自EventCreated.win:keepall()”。

当添加“avg()”时,你有什么称为未分组的完全聚合查询,并且“iterate()”返回单行,这是平均值。

对于这个使用嵌套上下文并且只使用“来自EventCreated(id = context.startEvent.Id)”的“initiatedBy”可能是过分的。