2016-10-07 80 views
0

考慮下列事件流和上下文的定義:艾斯波輸出解釋

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。

我第一次嘗試是這樣的:

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

「輸出快照」與「迭代()」結果相同。 「來自EventCreated」不保留任何事件,因此「iterate()」結果爲空。你正在尋找的是所有事件,所以「從EventCreated.win:keepall()」來代替。

當「avg()」被添加時,你有什麼稱爲未分組的完全聚合查詢,並且「迭代()」返回一個單一的行是平均值。

它可能是矯枉過正的使用嵌套的上下文,而只是「initiateBy」與「來自EventCreated(id = context.startEvent.Id)」。

+0

如果我使用.win:keepall(),每個事件都有一個輸出,那不是我想要的。我想爲我的上下文輸出一個「彙總」輸出,但沒有彙總數據,只是我的第一個和最後一個事件的一些細節。 我不明白如何用你的例子寫下我的問題,請你詳細說明一下嗎? –

+0

@IterableUnbound可以在這裏工作。 – goodie