使用事件視窗
在處理即時事件的應用程式中,常見的需求是針對落在一段時間內的事件子集執行一些集合式計算 (彙總) 或其他作業。在 StreamInsight 中,這些事件子集是透過「視窗」(Window) 來定義。本主題描述視窗與視窗定義、識別 StreamInsight 中支援的視窗種類,並且說明如何搭配各種運算子使用視窗。
本節內容
視窗類型
視窗頂端的作業
了解視窗
視窗會包含沿著時間表的事件資料,可讓您針對該視窗內的事件執行各種作業。例如,您可能想要在給定視窗中加總裝載欄位的值,如下圖中所示。
上圖說明如何將跳動視窗套用到事件資料流,以及如何將彙總套用到視窗資料流。夾帶彙總結果之事件的形狀取決於視窗輸出原則 – 在此處這些事件以視窗結尾的時間點事件表示。
視窗化作業會將事件資料流轉換為視窗資料流 (CepWindowStream<T>),然後當做集合式作業的基礎。沿著時間表的每個視窗都代表一組事件。您所使用的視窗類型會決定事件的排列方式:視窗可以是以時間為主或以計數為主。每個視窗類型都由視窗化運算子代表。
集合式作業會將視窗資料流轉換回事件資料流 (CepStream<T>)。這類集合式作業分為下列兩個群組:
針對一組輸入事件產生純量結果的彙總。
針對一組輸入事件產生零個或多個輸出事件的作業。
第一個群組的範例包括 sum、avg、count 及使用者定義彙總。可以將一個或多個這類彙總套用到視窗型資料流,好讓一個結果事件對應到每一個輸入視窗,其中的純量彙總結果會當做產生之事件裝載內的欄位。例如,您可能會想要加總視窗中一個或多個裝載欄位的值,並且根據這些值,執行其他處理或建立包含該彙總資料的另一個事件資料流。
第二個群組的範例包括 TopK 及使用者定義運算子。這些是透過視窗型資料流所定義,而且會在其計算結果中針對每一個視窗產生零個或多個事件。例如,您可能會想要使用 TopK 運算子,從針對特定輸入資料流所定義的每個快照集視窗中取得前五個事件,並且產生新的事件資料流,以便進行其他處理。
當視窗型資料流中的事件傳遞給集合式運算子以及當這些事件是從集合式運算子送回資料流中的輸出時,其時間戳記可能會進行轉換。這些轉換分別稱為「輸入原則」(Input Policy) 和「輸出原則」(Output Policy)。這些原則會影響事件出現在視窗中的方式,以及集合式作業的結果輸出為資料流的方式。
StreamInsight 支援下列視窗類型:
指定視窗
如下圖所示,視窗規格是由三個部分所組成:
視窗定義 (跳動視窗的時間範圍,計數式視窗的計數,沒有用於快照集視窗的參數)
輸入的暫時轉換 (輸入原則)
輸出的暫時轉換 (輸出原則)
此圖會以概念方式描述當資料流進行視窗上方的集合式作業時的轉換。
在點 A,事件的資料流會輸入到視窗運算子。
在點 B,視窗運算子會產生視窗的資料流。每個視窗都包含一組事件,這些事件的存留期間可能已經根據輸入原則加以更改。事件的資料流會輸入到集合式運算子 (如彙總) 或使用者定義運算子。
在點 C,集合式運算子會處理每一個視窗,並產生事件的資料流當做輸出。
對於彙總而言,系統會針對每一個集合建立一個事件 (如果視窗是空的則為零)。因為彙總只會指定純量值,所以輸出事件的存留期間預設為視窗的時間範圍。這同樣適用於內建彙總以及使用者定義彙總的結果。
如果是使用者定義運算子和 TopK,則會產生零個或多個事件。時間緊迫的 UDO 也會指定輸出事件存留期間。如果是時間不緊迫的 UDO 和 TopK 運算子,輸出事件的存留期間預設為視窗的時間範圍。
在點 D,輸出原則可以套用到輸出事件。如此可讓查詢作者修改事件的暫時屬性,並覆寫集合式運算子所產生的預設存留期間值。
以程式設計而言,此圖中的三個白色方塊會顯示為視窗運算子的參數。
視窗原則
視窗運算子會建立視窗的資料流,這些資料流是任何集合式作業都需要的輸入。與視窗本身的定義 (依據時間或計數) 不同的是,查詢作者可以影響 1) 在視窗中所包含的事件傳遞至集合式作業時,影響其存留期間的視窗化作業,以及 2) 如何調整作業之結果事件的存留期間。
查詢作者會將這兩個原則指定為視窗運算子的一部分,以便在視窗頂端控制或覆寫彙總或 UDO 的預設時間戳記。
輸入原則
在這個版本中,StreamInsight 支援單一輸入原則:將視窗中事件的開始時間和結束時間裁剪至視窗開始時間和結束時間。也就是說,任何 (時間緊迫的) 集合式作業將只看到視窗內部的事件時間戳記,即使在套用輸入原則之前,原始事件可能已經在視窗外部重疊也是如此。
輸入原則的指定為選擇性。為方便起見,類別 WindowInputPolicy 會提供傳回對應執行個體 (WindowInputPolicy.ClipToWindow) 的靜態屬性。
輸出原則
在此版本中,StreamInsight 支援下列輸出原則:
快照集視窗:產生之事件的結束時間會裁剪到視窗結束時間。
跳動視窗支援下列兩個輸出原則:
產生的事件是與視窗結尾時間一致的時間點事件。
產生之事件的結束時間會裁剪到視窗結束時間。
計數視窗:產生的事件會轉換成視窗結尾的時間點事件。
每個視窗類型都存在一個或多個不同的輸出原則類別。為方便起見,每個輸出原則類別都會提供傳回對應執行個體的靜態屬性:
SnapshotWindowOutputPolicy.Clip (若未指定,則為預設值)
HoppingWindowOutputPolicy.ClipToWindowEnd
HoppingWindowOutputPolicy.PointAlignToWindowEnd (若未指定,則為預設值)
CountWindowOutputPolicy.PointAlignToWindowEnd (若未指定,則為預設值)
下面是所有可用視窗的摘要以及它們對於集合式作業結果的影響:
快照集視窗:
輸出原則:一律「裁剪到視窗結尾」
輸出存留期間:
ClipToWindowEnd |
|
---|---|
內建彙總 |
視窗大小 |
TopK |
視窗大小 |
時間不緊迫的 UDA |
視窗大小 |
時間不緊迫的 UDO |
視窗大小 |
時間緊迫的 UDA/UDO |
不適用於快照集視窗 |
跳動視窗:
輸出原則:「裁剪到視窗結尾」或「PointAlignToWindowEnd」
輸出存留期間:
ClipToWindowEnd |
PointAlignToWindowEnd |
|
---|---|---|
內建彙總 |
視窗大小 |
位於視窗結尾的點 |
TopK |
視窗大小 |
位於視窗結尾的點 |
UDA |
視窗大小 |
位於視窗結尾的點 |
UDO |
視窗大小 |
位於視窗結尾的點 |
時間緊迫的 UDO |
傳回的存留期間,裁剪到視窗結尾 |
位於視窗結尾的點 |
計數視窗:
輸出原則:一律「位於視窗結尾的點」
輸出存留期間:
PointAlignToWindowEnd |
|
---|---|
內建彙總 |
不適用於計數視窗 |
TopK |
不適用於計數視窗 |
UDA |
位於視窗結尾的點 |
UDO |
位於視窗結尾的點 |
時間緊迫的 UDO |
位於視窗結尾的點 |