使用事件窗口
在处理实时事件的应用程序中,常常会要求对位于某个时间段内的事件子集执行某种基于数据集的计算(聚合)或其他操作。在 StreamInsight 中,这些事件子级通过“窗口”定义。本主题介绍窗口以及窗口的定义方式,标识在 StreamInsight 中支持的窗口类型,并说明如何将这些窗口与各种运算符一起使用。
本节主题
窗口类型
基于窗口的操作
了解窗口
窗口包含时间线上的事件数据,使您能够对该窗口中的事件执行各种操作。例如,您可能要对给定窗口中负载字段的值进行求和,如下图中所示。
上图显示跳跃窗口如何应用于事件流,以及聚合如何应用于窗口流。承载聚合结果的事件的形状依赖于窗口输出策略 – 在这里,它们由窗口末尾的点事件表示。
窗口操作将事件流转换为窗口流 (CepWindowStream<T>),然后该窗口流可作为基于集的操作的基础。沿时间线的每个窗口都表示一组事件。所使用的窗口类型决定了事件的并置方式:窗口可以基于时间或基于计数。每个窗口类型由窗口运算符表示。
基于集的操作将窗口流转换回事件流 (CepStream<T>)。此类基于数据集的操作分为以下两组:
为一组输入事件生成*“标量结果”*的聚合。
为一组输入事件生成*“零个或多个输出事件”*的操作。
第一组的示例是 sum、avg、count 和用户定义聚合。可以将一个或多个此类聚合应用于窗口流,这样,一个结果事件对应于每个输入窗口,其中标量聚合结果作为生成的事件负载中的字段。例如,可能需要汇总窗口中的一个或多个负载字段的值,并基于这些值执行其他处理或创建另一个包含该聚合数据的事件流。
第二组的示例是 TopK 和用户定义运算符。它们是对窗口流定义的,并且作为计算结果,每个窗口生成零个或多个事件。例如,可能需要使用 TopK 运算符从为特定输入流定义的每个快照窗口中获取排名最靠前的五个事件,并生成新的事件流以进行其他处理。
当窗口流中的事件传递到基于数据集的运算符时,以及它们从基于数据集的运算符输出回事件流中时,其时间戳可能会发生转换。这些转换分别称为“输入策略”和“输出策略”。这些策略会影响事件在窗口中的显示方式以及基于数据集的操作的结果流出的方式。
StreamInsight 支持以下窗口类型:
指定窗口
如下图所示,窗口规范由三部分组成:
窗口定义(针对跳跃窗口的时间范围,针对基于计数的快照窗口的计数,对于快照窗口则没有参数)
输入临时转换(输入策略)
输出临时转换(输出策略)
该图从概念上描述了某个流在窗口的基础上执行基于流的操作时是如何进行流转换的。
在点 A,事件流输入到窗口运算符。
在点 B,窗口运算符生成一个窗口流。每个窗口均包含一组事件。可能已根据输入策略更改了这些事件的生存期。该事件流输入到基于数据集的运算符(例如聚合)或用户定义的运算符。
在点 C,基于数据集的运算符处理每个窗口并且生成一个事件流作为输出。
对于聚合,为每个集创建一个事件(如果窗口为空则为零)。因为聚合只指定标量值,所以,输出事件的生存期默认设置为窗口时间范围。这适用于内置聚合以及用户定义聚合的结果。
对于用户定义的运算符和 TopK,将生成零个或更多事件。对时间敏感的 UDO 还指定输出事件生存期。对于对时间不敏感的 UDO 和 TopK 运算符,输出事件的生存期默认设置为窗口时间范围。
在点 D,可以将输出策略应用于输出事件。这允许查询作者修改事件的临时属性并且覆盖基于数据集的运算符生成的默认生存期值。
从编程角度来说,图中的三个白色框表示为窗口运算符的参数。
窗口策略
窗口运算符创建窗口流,窗口流是任何基于数据集的操作的必需输入。除了窗口本身的定义(就时间或计数而言)之外,查询作者还可以影响以下方面:1) 在事件传递到基于集的操作时窗口操作是如何影响在窗口中包含的事件的生存期的;2) 操作生存期的结果事件是如何进行调整的。
这两种策略都由查询作者指定为窗口运算符的一部分,以便控制或覆盖基于窗口的聚合或 UDO 的默认时间戳。
输入策略
在此版本中,StreamInsight 支持将窗口中事件的开始时间和结束时间剪辑到窗口开始时间和结束时间的单个输入策略。这意味着,任何(时间敏感的)基于集的操作都将只看到窗口内的事件时间戳,尽管原始事件可能已在应用该输入策略之前在窗口外重叠。
是否指定输入策略是可选的。为方便起见,类 WindowInputPolicy 提供一个静态属性,该属性返回相应实例 (WindowInputPolicy.ClipToWindow)。
输出策略
在此版本中,StreamInsight 支持以下输出策略:
快照窗口:得到的事件的结束时间将剪辑到窗口结束时间。
跳跃窗口支持以下 2 个输出策略:
得到的事件将是符合窗口结束时间的点事件。
得到的事件的结束时间将剪辑到窗口结束时间。
计数窗口:得到的事件将转换为窗口末尾的点事件。
对于每个窗口类型,存在单独的输出策略类。为方便起见,输出策略类分别提供一个静态属性,该属性返回相应实例:
SnapshotWindowOutputPolicy.Clip(如果未指定,则为默认值)
HoppingWindowOutputPolicy.ClipToWindowEnd
HoppingWindowOutputPolicy.PointAlignToWindowEnd(如果未指定,则为默认值)
CountWindowOutputPolicy.PointAlignToWindowEnd(如果未指定,则为默认值)
下面是所有可用窗口及其对基于数据集的操作结果的影响的汇总:
快照窗口:
输出策略:始终“剪辑到窗口末尾”
输出生存期:
ClipToWindowEnd |
|
---|---|
内置聚合 |
窗口大小 |
TopK |
窗口大小 |
对时间不敏感的 UDA |
窗口大小 |
对时间不敏感的 UDO |
窗口大小 |
对时间敏感的 UDA/UDO |
不可用于快照窗口 |
跳跃窗口:
输出策略:“剪辑到窗口末尾”或“PointAlignToWindowEnd”
输出生存期:
ClipToWindowEnd |
PointAlignToWindowEnd |
|
---|---|---|
内置聚合 |
窗口大小 |
窗口末尾的点 |
TopK |
窗口大小 |
窗口末尾的点 |
UDA |
窗口大小 |
窗口末尾的点 |
UDO |
窗口大小 |
窗口末尾的点 |
对时间敏感的 UDO |
返回的生存期,剪辑到窗口末尾 |
窗口末尾的点 |
计数窗口:
输出策略:始终“窗口末尾的点”
输出生存期:
PointAlignToWindowEnd |
|
---|---|
内置聚合 |
不可用于计数窗口 |
TopK |
不可用于计数窗口 |
UDA |
窗口末尾的点 |
UDO |
窗口末尾的点 |
对时间敏感的 UDO |
窗口末尾的点 |