快照窗口

快照窗口定义处于某个时间段内并且您可以对其执行某些基于集的计算(例如聚合)的事件的子级。快照窗口沿事件的开始时间和结束时间划分时间线,并因此是动态和事件驱动的。快照窗口可结合时间戳修改一起使用,它们非常灵活并且可用于多种不同的情况。

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

了解快照窗口

快照窗口是根据流中事件的开始和结束时间(而非时间线上的固定网格)定义的。窗口的大小和时间段只能通过流中的事件来定义。对于每对最近的事件端点(开始时间和结束时间),将创建一个快照窗口。通过此定义,所有事件的开始时间和结束时间都将位于窗口边界上,从不介于它们之间。即,快照窗口根据所有发生的更改划分时间线。

下图显示了一个包含三个事件(e1、e2 和 e3)的流。竖线表示这些事件定义的快照窗口边界。浅蓝色的事件流表示事件流随时间的移动。橙色框显示快照窗口以及每个窗口中包含的事件。例如,基于开始时间和结束时间,只有事件 e1 位于第一个快照窗口中。但是,事件 e1 和 e2 都是重叠的,因此包含在第二个窗口中。

快照窗口图

在框架应用将事件剪辑到窗口的输入策略(当前唯一可用的输入策略)后,事件将按下图中所示出现。

具有剪辑到窗口的事件的快照窗口。

它们是输入到实际基于集的操作的窗口和事件。在应用能够检查输入事件的时间戳的用户定义的时间敏感聚合或运算符时,理解剪辑行为十分重要。

定义快照窗口

快照窗口没有用于窗口定义的参数。默认窗口策略将输入和输出事件剪辑到窗口大小。

var snapshotAgg = from w in inputStream.SnapshotWindow()
                  select new { sum = w.Sum(e => e.i) };

上面示例中快照窗口的参数是返回相应策略类别的实例的静态属性。提供这些属性是出于方便目的。

快照窗口是可用于实现滑动窗口的强大的构造。滑动窗口是时间随事件一起移动的窗口,而不是固定期间。滑动窗口的优势在于,它根据输入事件调整其长度,因此如果输入没有变化,就不生成任何输出。这可被视作用于压缩事件流的方法。此类设计对于分组和应用运算符内的聚合(具有构成大量组的输入数据)特别有用。对于跳跃窗口,每个组都将为每个窗口生成一个结果,而与输入的变化率无关。有关详细信息,请参阅跳跃窗口

通过将快照运算符与输入流的相应临时修改配对,实现滑动窗口。时间戳修改(通常是事件持续时间的扩展)将首先更改经过一段时间后各事件的“覆盖范围”。然后,该快照将包含处于该持续时间内的所有事件。例如,假定目标是计算过去三分钟的点事件输入流的滑动平均值。下图说明对输入流应用 AlterEventDuration() 方法是如何沿时间线“拉伸”每个事件的。

具有修改的时间戳的快照窗口。

在该流上,应用快照运算符,并且对得出的窗口计算针对预期事件字段的平均值,如下图中所示。

具有聚合(平均值)结果的快照窗口。

此图中最终得出的事件描述各时间点上过去 3 分钟内所有事件的平均值。此结果由间隔事件表示,并且只要平均值在该时间范围内未变化就一直持续。例如,该序列中的第四个事件认定过去 3 分钟内所有事件的平均值是 1.5,这是从该事件内的任何点测量的。在具有负载 3 的点事件刚刚处于该 3 分钟窗口外时结果事件开始,并且刚好在具有负载 1 的点事件处于窗口外之前结果事件结束,如下图所示。

具有点事件结果的快照窗口。

使用语言集成查询 (LINQ),此应用场景如下所示(假定输入事件类型具有字段“Value”)。

var result = from win in inputStream.AlterEventDuration(e => TimeSpan.FromMinutes(3)).SnapshotWindow()
             select new { average = win.Avg(e => e.Value) };

通常,为了在通过快照应用基于集的操作时“回溯”某个时间量,事件生存期必须延伸到将来。可以使用其他类型的事件生存期修改运算符来取得不同结果。有关详细信息,请参阅时间戳修改

请参阅

概念

聚合

TopK

用户定义聚合和运算符

时间戳修改

计数窗口

跳跃窗口

使用事件窗口