跳跃窗口

跳跃窗口定义处于某个时间段内并且您可以对其执行某些基于集的计算(例如聚合)的事件的子级。跳跃窗口不同于计数和快照窗口之处在于,它们沿定期划分时间线,而与事件开始时间或结束时间无关。StreamInsight 允许重叠跳跃窗口以及在连续窗口之间保留间隙。 

有关事件窗口及其在 StreamInsight 中的实现和用法的一般性说明,请参阅使用事件窗口

了解跳跃窗口

跳跃窗口是按固定时段在时间中向前“跳跃”的窗口。该窗口由两个时间范围定义:跳跃大小 H 和窗口大小 S。对于每个 H 时间单位,将创建一个大小为 S 的新窗口。

下图显示了一个包含一系列点事件的流。竖线显示将时间线分段的跳跃窗口。这里,H 等于 S。这表示一个无缝、不重叠的跳跃窗口,也称为“翻转窗口”。为了方便,对于此类型的窗口存在单独的扩展方法。每个橙色框都表示窗口流以及与该窗口关联的事件。

翻转窗口

对于每个此类窗口,执行基于集的操作并且将生成结果,同时具有依赖于与窗口一起指定的输出策略的时间戳。对于输出策略 PointAlignToWindowEnd,结果如下:

带有 PointAlignToWindowEnd 的翻转窗口

如果事件跨越窗口边界,则它将包含在多个窗口中。下图显示了一个包含三个内部事件(在这个例子中,这三个内部事件分别为 e1、e2 和 e3)的流。如果跳跃大小 H 小于窗口大小 S,则这些窗口将重叠,这样,重叠期间内的事件将属于多个窗口,即使它们是不跨多个窗口的点事件时也是如此。

跳跃窗口图

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

也可以指定对齐参数。例如,24 小时翻转窗口的默认对齐是在午夜开始和结束每个窗口。如果指定某一自定义对齐(例如,从 9:00 A.M. 到 9:00 A.M. 的 24 小时窗口),将根据时间线上的此绝对点对齐窗口(在这个例子中,将 9:00 A.M. 作为其时间部分的任何 datetime 值)。该对齐参数必须指定为 DateTimeKind.Utc 类型的 DateTime 对象。

务必要了解的是,通过使用跳跃窗口,应用的基于集的操作将生成一个结果,而与是否已针对以前的窗口对输入进行了更改无关。这是因为跳跃窗口沿定期划分时间线。下图显示如何应用比其跳跃大小长得多的跳跃窗口。这是典型的情况,例如“每 10 秒钟,计算 5 分钟内所有事件的平均值”。

具有重叠事件的跳跃窗口。

下图显示在输出策略为 PointAlignToWindowEnd 时基于窗口流的此类聚合的结果。

带有 PointAlignToWindowEnd 的聚合

对于像 Sum、Avg、Count 之类的对时间不敏感的聚合,该图中的所有聚合结果都具有相同值,因为它始终是涉及基础窗口的相同负载集 e1 和 e2。尤其是在此类窗口要应用于某个组内并且应用具有大量组的操作的情况下,必须考虑这一重复结果的行为。对于频率高于原始事件频率(例如,如上一图中所示)的窗口频率,输出事件率将很重要。如果只有在输入发生变化时才应生成聚合结果,则应改用快照窗口。

输出策略

PointAlignToWindowEnd

输出策略将生成一个点事件,其开始时间是窗口的结束时间,如上图中所示。在您将结果与其他流合并时,这个新的输出策略将很有用,因为在每个时间点只有单个有效结果,表示在该点的最近聚合结果。具有此输出策略的跳跃窗口可与点到信号设计模式相结合,创建聚合结果的连续流,这将在每个时间点包含承载上一已知结果的间隔事件。

如果未指定输出策略,PointAlignToWindowEnd 将是跳跃窗口的默认输出策略。

ClipToWindowEnd

此输出策略将生成与基于集的操作的生存期相对应的窗口大小,如下图中所示。请注意,这会对查询的活动性造成影响。

用于跳跃窗口的 ClipToWindowEnd 输出策略用于跳跃窗口的新输出策略

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) };

跳跃(或翻转)窗口对齐方式是可选参数。在下面的示例中,每个窗口都在 9:00 A.M.通用协调时间 (UTC) 开始和结束。

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

用户定义聚合和运算符

计数窗口

快照窗口

使用事件窗口