快照集視窗
快照集視窗定義了落在一段時間內的事件子集,您可以對這些事件執行一些集合式計算,例如彙總。快照集視窗會按照事件的開始和結束時間來分割時間表,所以是由事件驅動而呈動態變化。若再搭配時間戳記修改,這類視窗可謂極具彈性且適用於多種不同案例。
如需事件視窗的一般描述及其在 StreamInsight 中的實作方式與用法,請參閱<使用事件視窗>。
了解快照集視窗
快照集視窗是根據資料流中事件的開始和結束時間所定義,而非根據沿著時間表的固定方格。視窗的大小和時間週期只由資料流中的事件所定義。系統會針對每一對最接近的事件端點 (開始時間和結束時間) 建立快照集視窗。依照這個定義,所有事件的開始和結束時間都會落在視窗界限上,絕對不會在視窗之間。也就是說,快照集視窗會根據所有發生的變更分割時間表。
下圖顯示包含三個事件的資料流:e1、e2 和 e3。垂直列顯示這些事件所定義的快照集視窗界限。淺藍色的事件資料流代表隨著時間移動的事件資料流。橙色方塊顯示快照集視窗以及每個視窗所包含的事件。例如,根據開始時間和結束時間,只有事件 e1 位於第一個快照集視窗中。不過,事件 e1 和 e2 會重疊,因此它們都包含在第二個視窗中。
當此架構套用輸入原則而裁剪事件至視窗界限之後 (這是目前唯一可用的輸入原則),事件的呈現方式將如下圖所示。
這些項目為輸入至實際集合式作業的視窗和事件。了解裁剪行為非常重要,特別是當套用時間緊迫的使用者定義彙總或運算子,其能夠檢查輸入事件的時間戳記之情況。
定義快照集視窗
快照集視窗的視窗定義沒有任何參數。預設視窗原則將輸入和輸出事件裁剪至符合視窗大小。
var snapshotAgg = from w in inputStream.SnapshotWindow()
select new { sum = w.Sum(e => e.i) };
上述範例中快照集視窗的引數為靜態屬性,這些屬性會傳回對應原則類別的執行個體。為方便起見,提供這些屬性。
快照集視窗是一種強大的建構,可用於實作滑動視窗。滑動視窗是會隨事件逐時移動 (而非移一段固定時間) 的視窗。滑動視窗的優點在於可依據輸入事件調整長度,因此若輸入未曾變動就不會產生任何輸出。這可視為壓縮事件資料流的一種方式。此類設計特別有利於群組和套用運算子內部的彙總作業,其中由輸入資料構成大量群組的情況。若使用跳動視窗,每個群組將單獨為個別視窗產生一項結果,而與輸入的變動率無關。如需詳細資訊,請參閱<跳動視窗>。
滑動視窗是使用快照集運算子配合適當地暫時修改輸入資料流的方式實作。時間戳記修改 (通常是要延長事件持續時間) 會先變更每個事件歷經一段時間的「涵蓋範圍」,隨後快照集將包含所有落在該持續時間內的事件。例如,假定目標是要計算點事件輸入資料流自過去三分鐘以來的滑動平均。下圖顯示如何應用 AlterEventDuration() 方法,沿著下圖所示的時間表「伸展」輸入資料流上的每個事件。
快照集運算子會套用至該資料流,然後再對結果視窗執行計算而求得所需事件欄位的平均,如下圖所示。
上圖最終產生的事件描述了所有事件在過去三分鐘內每個時間點的平均。此結果是由間隔事件表示,只要平均值在該時間範圍內皆未曾變動就會持之以恆。例如,此序列中的第四個事件宣稱,從該事件內的任何時間點開始測量,所有事件在過去三分鐘期間的平均都是 1.5。當裝載為 3 的點事件一落在三分鐘窗期外,結果事件即告開始,而當裝載為 1 的點事件快要移出視窗之前,結果事件就會結束,如下圖所示。
此案例使用 Language Integrated Query (LINQ) 的表達方式如下 (假設輸入事件類型具有 'Value' 欄位)。
var result = from win in inputStream.AlterEventDuration(e => TimeSpan.FromMinutes(3)).SnapshotWindow()
select new { average = win.Avg(e => e.Value) };
一般而言,透過快照集套用集合式作業時若想要「回溯」一段時間,事件存留期間必須延伸到未來。使用其他類型的事件存留期間修改運算子可以達到不同的結果。如需詳細資訊,請參閱<時間戳記修改>。