【翻译】StreamInsight窗口:基础知识
原文链接: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