計數視窗

 

計數視窗定義了落在一段時間內的事件子集,您可以對這些事件執行一些集合式計算,例如彙總。 與快照集視窗相同的是,計數視窗沒有固定的視窗大小, 而是由其包含的事件數目所定義。 這樣可以因應必須針對事件頻率不規則的資料流中特定數目的事件套用集合式作業的某些情況。

System_CAPS_ICON_tip.jpg 提示


在這個 StreamInsight 版本中,計數視窗只能搭配使用者定義彙總或使用者定義運算子使用,無法搭配內建彙總和 TopK 使用。

如需事件視窗的一般描述及其在 StreamInsight 中的實作方式與用法,請參閱<使用事件視窗>。

了解計數視窗

計數視窗的變動視窗大小是由沿著時間表的相異事件開始時間的計數所定義。 這一組計數視窗 (計數為 N) 定義為包含 N 個連續事件開始時間的所有範圍,其中 N 至少為 1。 更精確地說,這類時間範圍的每一個都是以開始時間加上第 N 個相異事件的一個刻度當做結尾。 計數視窗會沿著具有每一個相異事件開始時間的時間表移動。 因此,只要達到計數,定義新事件開始時間的每一個新的事件都會造成新計數視窗的建立。 也就是說,只要相異事件開始時間的數目小於 N,就不會建立新的視窗。 就如同跳動視窗一樣,計數視窗之間的位移也稱為跳動大小;但與跳動視窗不同的是,計數視窗的跳動大小通常並不固定。

如果時間表上的每個事件都具有唯一的時間戳記,每個這類視窗中的事件數目就會等於 N。 如果多個事件具有相同的事件開始時間,則包含的事件數目就會高於 N。 將彙總套用至視窗時,請務必了解這種行為。

下圖顯示包含三個事件的資料流:e1、e2 和 e3。 分隔號顯示這些事件所定義的計數視窗界限。 淺藍色的事件資料流代表隨著時間移動的事件資料流。 橙色方塊顯示計數視窗以及每個視窗所包含的事件。 前兩個相異事件開始時間各屬於 e1 和 e2,而第一個計數視窗跨越對應的期間,以 e1 的開始時間起始,並以 e2 的開始時間加上一個刻度當做結尾。 第二個視窗則包含了 e2 和 e3 的開始時間:

CountWindowForEvents

請注意,上圖所示視窗中的事件已被視窗輸入原則所裁剪。 對於所有 StreamInsight 視窗,輸入原則會裁剪事件以符合視窗大小。 具有時效性的彙總或運算子將使用視窗中這些裁剪過的事件存留期間,而非原始期間。

下圖顯示具有點事件的計數視窗,這些事件只有在單一時刻才有效。 然後進一步示範 CountWindow() 方法會計算相異事件開始時間的數目,而不是計算事件本身。 此圖顯示點事件的資料流。 分隔號顯示這些點事件所定義的計數視窗開始時間。 淺藍色的事件資料流代表隨著時間移動的事件資料流。 請注意,兩個事件會同時排列。 橙色方塊顯示計數視窗以及每個視窗所包含的事件。 這兩個排列的事件會算為與視窗參數 N 有關的一個單位。

計數視窗。

如果是點事件,當定義視窗結束時間時,將一個刻度加入到第 N 個事件開始時間的這項視窗行為,會造成視窗整個併入它的所有事件。

System_CAPS_ICON_note.jpg 注意事項


對於 CEPStream 資料流,請使用 CountByStartTimeWindow() 方法。

定義計數視窗

計數視窗是由沿著時間表的相異事件開始時間的計數所定義。 計數視窗是在 Language Integrated Query (LINQ) 中指定,如下列範例所示。 輸入原則一律為 ClipToWindow,而輸出原則則一律為 PointAlignToWindowEnd

var agg = from w in inputStream.CountByStartTimeWindow(10)  
          select new { sum = w.MySum(e => e.i) };  

因為計數視窗目前無法搭配內建彙總使用,所以上述範例會採用使用者定義彙總 MySum。

至於任何其他視窗,這個視窗輸出原則會套用至集合式作業的結果。 計數視窗唯一可用的輸出原則,是在視窗結尾產生一個點事件。 該點時間的時間戳記與視窗中最後一個事件的開始時間一致。 換言之,點事件仍然落入視窗範圍內。 套用上圖的輸入彙總之後,輸出資料流便如下圖所示:

CountWindowforEvents3

若為時間緊迫的使用者定義運算子 (UDO),其中 UDO 可能產生包括時間戳記的結果事件,那麼輸出原則會覆寫時間戳記。 UDO 傳回的每個事件都將轉換為位於視窗結尾的點事件,所以各個點會與視窗中最後一個事件的開始時間對齊,就像是來自彙總的單一結果事件,如上圖所示。

請參閱

彙總
TopK
使用者定義彙總和運算子
跳動視窗
快照集視窗