您的位置:首页 > 其它

数据流挖掘——窗口内的计数问题

2013-08-19 15:27 141 查看
转自:http://msdn.microsoft.com/zh-cn/library/ff518595(v=sql.105).aspx

计数窗口定义处于某个时间段内并且您可以对其执行某些基于集的计算(例如聚合)的事件的子级。计数窗口与快照窗口相似,也没有固定的窗口大小。它们由其包含的事件的数目定义。这可以实现多种方案,其中,基于集的操作必须应用于具有非定期事件频率的流中特定数目的事件。


 提示
在此版本的 StreamInsight 中,计数窗口只能用于用户定义聚合或用户定义运算符,不能用于内置聚合和 TopK。
有关事件窗口及其在 StreamInsight 中的实现和用法的一般性说明,请参阅使用事件窗口

了解计数窗口

计数窗口的可变窗口大小由沿时间线的不同事件开始时间的计数确定。计数为 N 的计数窗口集定义为包含 N 个连续事件开始时间的所有时间范围,其中 N 至少为 1。更准确地讲,每个此类时间范围都以开始时间加上第 N 个不同事件的一个时钟周期来结束。计数窗口沿具有每个不同事件开始时间的时间线移动。因此,只要满足计数,定义新事件开始时间的每个新事件都将导致创建新的计数窗口。也就是说,只要不同事件开始时间的数目小于 N,就不创建新窗口。与跳跃窗口一样,计数窗口之间的偏移量称作跳跃大小;但与跳跃窗口不同的是,一般来讲,计数窗口的跳跃大小将不固定。

如果时间线上的每个事件都有唯一时间戳,则每个此类窗口中事件的数目将等于 N。如果多个事件具有相同的事件开始时间,则包含的事件的数目将高于 N。在将聚合应用于该窗口时理解此行为是十分重要的。

下图显示了一个包含三个事件(e1、e2 和 e3)的流。竖线表示这些事件定义的计数窗口边界。浅蓝色的事件流表示事件流随时间的移动。橙色框显示计数窗口以及每个窗口中包含的事件。前两个不同事件开始时间属于 e1 和 e2,并且第一个计数窗口跨越相应的期间,以 e1 的开始时间开始,以 e2 的开始时间加上一个时钟周期结束。第二个窗口包含 e2 和 e3 的开始时间:



请注意,此图说明已按照窗口输入策略剪辑的窗口中的事件。对于所有 StreamInsight 窗口,输入策略是将事件剪辑到窗口大小。对时间敏感的聚合或运算符将在窗口中使用这些已剪辑的事件生存期,而非使用原始的事件生存期。

下图显示具有点事件的计数窗口,这些点事件仅对单个时间实例有效。这进一步阐释了 CountByStartTimeWindow() 方法对不同的事件开始时间进行计数,而非对事件本身进行计数。该图说明点事件流。竖线表示这些点事件定义的计数窗口开始时间。浅蓝色的事件流表示事件流随时间的移动。请注意,两个事件同时并置。橙色框显示计数窗口以及每个窗口中包含的事件。就窗口参数 N 而言,这两个并置的事件作为一个单位计数。



对于点事件,在定义窗口结束时间时该窗口向第 N 个事件的开始时间加上一个时钟周期的行为将导致窗口完全包括其所有事件。

定义计数窗口

计数窗口由沿时间线的不同事件开始时间的计数定义。计数窗口在语言集成查询 (LINQ) 中指定,如下例所示。输入策略始终为 ClipToWindow,输出策略始终为PointAlignToWindowEnd。

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


因为计数窗口当前不能用于内置聚合,所以上例假定用户定义聚合 MySum。

与任何其他窗口一样,此窗口输出策略应用于基于数据集的操作的结果。针对计数窗口的唯一可用输出策略是在窗口的末尾生成一个点事件。点时间的时间戳与窗口中最后一个事件的开始时间一致。换言之,点事件仍处于窗口范围内。在应用上图的输入的聚合后,输出流如下所示:



对于时间敏感的用户定义运算符 (UDO)(其中,UDO 可生成包括时间戳的结果事件),时间戳由输出策略覆盖。UDO 返回的每个事件都在窗口末尾转换为一个点事件,这样,该点将与窗口中最后一个事件的开始时间一致,就像来自某个聚合的单个结果事件,如前一关系图所示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: