原文連結:http://blogs.msdn.com/b/streaminsight/archive/2010/11/23/windows-part-1-the-basics.aspx
原文作者:Roman Schindlauer——StreamInsight小組資深程式經理,他的老闆就是前面博文中提到的Torsten Grabs。
如果你開始學習怎樣編寫StreamInsight查詢,那麼最可能碰到的首個概念就是視窗(windows)。在這篇博文中,我們將介紹視窗的使用方法,希望能夠協助讀者更好地瞭解使用視窗的一些好處和限制。哈哈,這裡的視窗不是Microsoft Windows哦。
在事件處理的世界裡,視窗被用來定義集合,而這些集合會成為一些集合操作的對象。這些操作可能是:
- 計算單一結果的彙總操作,如sum, count, min, max或者使用者自訂的彙總操作;
- 返回基於表單的多個操作結果,如TopK或者使用者自訂的操作符。
StreamInsight視窗將時間軸切分為了有窮的片段。
StreamInsight視窗的長度可以是一個固定的時間跨度(跳動視窗HoppingWindow和筋鬥視窗TumblingWindow),也可以由事件本身來決定(計數視窗CountingWindow和快照集視窗SnapshotWindow)。是一個“筋鬥視窗”的樣本,其中“sum”合計用在了某些負載域上:
視窗和集合操作常常需要放在一起來進行操作,整合了集合操作的視窗可以看作StreamInsight查詢中的一個“積木”。下面是使用LINQ構造帶有集合操作和視窗的一個查詢:
var result = from window in input .TumblingWindow(TimeSpan.FromMinutes(5), HoppingWindowOutputPolicy.ClipToWindowEnd) select new { sum = window.Sum(e => e.Value) };
此類結合視窗和集合操作的組件之上便是接受CepStream和產生CepStream。首先由視窗擴充函數返回CepWindowStream,接下去在其上應用集合操作。後面我們將撰寫另一篇博文來討論這些特定的視窗類別型。
有的時候一想到視窗僅僅是“記憶體中的一些事件集合”,大家就會問到關於如何“訪問”視窗的不同方法。的確,視窗是StreamInsight可控記憶體中的事件集合,並且可以用編程的方式訪問:使用使用者自訂的彙總操作(user-defined aggregates,簡稱UDAs)或使用者自訂動作符(user-defined operators,簡稱UDOs)。這些擴充介面能夠讓你編寫C#的代碼對視窗內的事件進行操作,如產生單個的彙總結果(使用UDA)或產生1個到多個的完整事件(使用UDO)。這些都在StreamInsight APi中作為子類型提供給大家使用。這些介面最好的地方在於,雖然它們在StreamInsight事件處理流中引入了命令式編程,但是同時也支援聲明式模型:接受事件集(視窗)並對應地輸出一些結果。在這個過程中使用者並不需要擔心UDA或者UDO會以怎樣的順序在運行時被調用。此外由於這個介面中傳入的事件集是IEnumerable,我們還可以在其上編寫LINQ to Objects哦!
對於那些還沒有玩過進階聲明式編程模型(如使用LINQ編寫UDA/UDO)的開發人員來說,這聽起來也許很誘惑,但是我建議大家先使用StreamInsight內建的操作符來編寫一些查詢,以熟悉一下StreamInsight的運行時。
此致,
Roman