考虑以下事件流和上下文定义:
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;
但我真的很想知道我的语法有什么问题,因为它感觉正确。
答案 0 :(得分:0)
“输出快照”与“iterate()”结果相同。 “from EventCreated”不保留任何事件,因此“iterate()”结果为空。您正在寻找的是所有事件,所以“来自EventCreated.win:keepall()”。
当添加“avg()”时,你有什么称为未分组的完全聚合查询,并且“iterate()”返回单行,这是平均值。
对于这个使用嵌套上下文并且只使用“来自EventCreated(id = context.startEvent.Id)”的“initiatedBy”可能是过分的。