Share via


跳動視窗

跳動視窗定義了落在一段時間內的事件子集,您可以對這些事件執行一些集合式計算,例如彙總。跳動視窗有別於計數視窗和快照集視窗,本視窗會按定期間隔分割時間表,而與事件開始或結束時間無關。StreamInsight 允許跳動視窗重疊,也能讓連續視窗之間留有空隙。 

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

了解跳動視窗

跳動視窗是指向前「跳動」一段固定時間的視窗。此視窗是由兩個時間範圍所定義:跳動大小 H 和視窗大小 S。系統會針對每個 H 時間單位,建立大小為 S 的新視窗。

下圖顯示包含一連串時間點事件的資料流。分隔號會顯示分割時間表的跳動視窗。此處,H 等於 S。這代表無間距且非重疊的跳動視窗,也稱為*「輪轉視窗」*(Tumbling Window)。為了方便起見,這一類型的視窗還有另一個擴充方法。每個橙色方塊都代表視窗的資料流以及與該視窗相關聯的事件。

輪轉視窗

對於每個這類的視窗,系統會使用相依於針對視窗所指定之輸出原則的時間戳記,執行集合式作業並產生結果。若是 PointAlignToWindowEnd 輸出原則,其結果外觀如下:

輪轉視窗與 PointAlignToWindowEnd

如果某個事件跨越視窗界限,它就會包含在多個視窗中。下一個圖顯示包含三個間隔事件的資料流:e1、e2 和 e3。如果跳動大小 H 小於視窗大小 S,則視窗將會重疊,使得重疊期間內的事件落在一個以上的視窗中,即使這些是不會橫跨多個視窗的時間點事件也是如此。

跳動視窗圖例

請注意,上圖所示視窗中的事件已被視窗輸入原則所裁剪。對於所有 StreamInsight 視窗,輸入原則會裁剪事件以符合視窗大小。時間緊迫的彙總或運算子將使用視窗中這些裁剪過的事件存留期間,而非原始期間,亦即,它將不會「看到超越的」視窗。

您可以選擇性地指定對齊參數。例如,24 小時輪轉視窗的預設對齊方式是在午夜開始和結束每個視窗。如果指定了自訂對齊方式 (例如從上午 9:00 到上午 9:00 共 24 小時),就會根據時間表上的這個絕對點對齊視窗化 (在此情況下,任何 datetime 值的時間部分都將是上午 9:00)。您必須將對齊參數當做 DateTimeKind.Utc 種類的 DateTime 物件提供。

請務必了解,如果使用了跳動視窗,套用的集合式作業就會產生單一結果,不論輸入是否已隨著前一個視窗而變更都是如此。這是因為跳動視窗會以固定間隔分割時間表。下圖顯示跳動視窗遠比其跳動大小還要久的應用程式。這類典型的情況像是「每隔 10 秒計算一次五分鐘內所有事件的平均」。

具有重疊事件的跳動視窗

當輸出原則為 PointAlignToWindowEnd 時,下圖顯示視窗型資料流上方的這類彙總結果。

彙總與 PointAlignToWindowEnd

對於時間不緊迫的彙總 (如 Sum、Avg、Count 等等),此圖表中的所有彙總結果都會得到相同的值,因為基礎視窗始終涉及到相同一組裝載,即 e1 和 e2。請務必將代表性結果的這項行為納入考量,特別是在群組內部套用的視窗且為套用大量群組運算的情況。當視窗頻率高過原始事件頻率 (如上圖所示之範例) 時,輸出事件速率將超乎尋常。如果只有在輸入變更時才會產生彙總結果,應該改用快照集視窗。

輸出原則

PointAlignToWindowEnd

此輸出原則會產生一個時間點事件,其開始時間為視窗的結束時間,如上圖所示。當您將結果與其他資料流相結合時,這個新的輸出原則相當實用,因為每個時間點只有一個單一有效結果,這個結果表示當時最新的彙總結果。包含此輸出原則的跳動視窗可以與點對訊號的設計模式結合,建立彙總結果的連續資料流,這個資料流在個時間點都包含夾帶最新結果的間隔事件。

如果未指定輸出原則,PointAlignToWindowEnd 是跳動視窗的預設輸出原則。

ClipToWindowEnd

這個輸出原則會產生一個對應於集合式作業存留期間的視窗大小,如下圖所示。請注意,這對於查詢的有效性而言,將會有不同的含意。

跳動視窗的 ClipToWindowEnd 輸出原則。跳動視窗的 New 輸出原則。

CTI 行為

請注意,跳動視窗可以對目前時間增量 (CTI) 事件造成影響。當輸出原則為 ClipToWindowEnd 時,每個 CTI 事件都將移到各自的視窗起始處。其原因是,視窗大小會指派到視窗頂端的作業結果。因此只要視窗內仍接獲事件,視窗的整體時間範圍都有可能變動。不過,當輸出原則為 NEW_POLICY 時,就會在不變更的情況下通過 CTI 事件。如需有關 CTI 事件的詳細資訊,請參閱<提前應用程式時間>。

定義跳動視窗

跳動視窗是由其視窗大小和跳動大小所定義,如下列範例所示。

var hoppingAgg = from w in inputStream.HoppingWindow(TimeSpan.FromHours(1),
                                                     TimeSpan.FromMinutes(10))
                 select new { sum = w.Sum(e => e.i) };

上述範例中跳動視窗的原則引數為靜態屬性,該屬性會傳回對應原則類別的執行個體。

如果跳動大小與視窗大小相同,就可以使用稱為輪轉視窗的縮寫版本,如下列範例所示。

var tumblingAgg = from w in inputStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { sum = w.Sum(e => e.i) };

跳動 (或轉動) 視窗的對齊方式為選擇性參數。在下列範例中,每個視窗都是在國際標準時間 (UTC) 上午 9:00 開始和結束。

var alignment = new DateTime(TimeSpan.FromHours(9).Ticks, DateTimeKind.Utc);
var snapshotAgg = from w in inputStream.TumblingWindow(
                         TimeSpan.FromHours(24),
                         alignment,
                         HoppingWindowOutputPolicy.ClipToWindowEnd)
                  select new { sum = w.Sum(e => e.i) };

請參閱

概念

彙總

TopK

使用者定義彙總和運算子

計數視窗

快照集視窗

使用事件視窗