$sessionWindow
定义
$sessionWindow
阶段指定了用于聚合数据的会话窗口。会话窗口允许您在输入流中的每个活动“会话”上运行管道。如果两个文档具有相同的分区,并且它们的时间戳差异小于会话间隔,则它们位于同一会话中。关闭窗口时,其结果将发布到下一个阶段。
当水印推进的时间超过会话中最大文档时间戳的 gap
值加上 allowedLateness
值的持续时间时,会话窗口将关闭。关闭会话窗口的开始时间是会话中第一个事件的时间戳,结束时间是会话中最后一个事件的时间戳,再加上间隔时间。会话窗口结束时间是在会话中的最大时间戳上加上间隔。窗口结果是 $sessionWindow.pipeline
在适合该窗口的文档上的输出。
语法
$sessionWindow
阶段采用包含以下字段的文档:
字段 | 类型 | 必要性 | 说明 |
---|---|---|---|
| 表达式(expression) | 必需 |
|
| 文档 | 必需 | 该文档将关闭会话之前等待股票
例如,如果 |
| 字符串 | Optional | 指定窗口边界是由事件时间还是处理时间决定的字符串。值可以是 当 |
| 阵列 | 必需 | 根据窗口内的消息对嵌套聚合管道进行评估。 |
| duration | Optional | 该文档指定了时间量的组合,由
示例,“3”的 如果省略,则默认值为 3 秒。 |
行为
每个到达 $sessionWindow
阶段的输入文档都会分配一个来自 partitionBy
表达式的分区。每个文档都会根据其分区和时间戳分配到一个会话窗口。这可能是新的或现有的会话窗口。关闭窗口时,其结果将发布到下一个阶段。窗口结果是管道在窗口中的文档上的输出。
当水印推进的间隙时间和 allowedLateness
值超过会话中最大文档时间戳时,会话窗口将关闭。已关闭的会话窗口的开始时间是会话中第一个事件的时间戳。已关闭的会话窗口的结束时间是会话中最后一个事件的时间戳加上间隔时间。会话窗口结束时间将间隔时间添加到会话中的最大时间戳中。
注意
假设分区 A 有一个会话窗口,其最大时间戳为 2024-01-01 00:40:00
。如果间隔 1 小时后分区 A 没有后续文档到达,当水印达到 2024-01-01 01:40:00
时,会话窗口将关闭。
如果输入文档的 partitionBy
表达式失败,则将该文档发送到 DLQ。处理无序数据时,文档可以在同一分区的现有会话Windows的间隙内到达并带有时间戳。 这将合并会话Windows。
如果文档到达 $sessionWindow
阶段,其时间戳小于源中最新水印的值,并且该文档没有打开的会话,则该文档将被发送到 DLQ。当文档到达 $sessionWindow
阶段时,会设立其流元 window.partition
、window.start
和 window.end
字段。
事件可能会无序到达。两个具有相同 partitionBy
值的事件可能会到达,并且它们的时间戳可能相隔超过间隔。最初,这些事件将被放置在单独的会话窗口中。稍后,可能会有另一个事件到来,合并这两个会话窗口。