Flink 使用窗口结果


0
(0)

窗口操作的结果还是一个DataStream,没有保留的信息窗口的操作结果元素,没有关于窗口操作的信息被保留在结果元素中,所以如果你想保留关于窗口的元信息,你必须手动将这些信息编码到ProcessWindowFunction的结果元素中。在结果元素上设置的唯一相关信息是元素时间戳。它被设置为已处理窗口允许的最大时间戳,即结束时间戳- 1,因为窗口结束时间戳是排他的。注意,这对于事件时间窗口和处理时间窗口都是正确的。例如,在一个窗口操作元素之后总是有一个时间戳,但这可以是一个事件时间戳或一个处理时间戳。对于处理时间窗口,这没有特别的含义,但是对于事件时间窗口,这一点以及水印与窗口的交互方式使得具有相同窗口大小的连续窗口操作成为可能。我们将在看了水印如何与窗口交互之后介绍这一点。

水印和窗口的相互作用

在继续本节之前,您可能希望看看我们关于事件时间和水印的部分。

当水印到达窗口操作符时,会触发两件事:

  • 水印触发所有最大时间戳(end-timestamp – 1)小于新水印的窗口的计算
  • 水印被(按原样)转发到下游操作

直观地说,一旦下游操作接收到水印,水印就会“清除”所有可能被认为是后期操作的窗口。

连续窗口的操作

如前所述,计算加窗结果的时间戳的方式以及水印与窗口交互的方式允许将连续加窗操作串在一起。当你想要执行两个连续的窗口操作,你想使用不同的键,但仍然希望来自相同的上游窗口的元素最终在相同的下游窗口时,这是很有用的。

DataStream<Integer> input = ...;

DataStream<Integer> resultsPerKey = input
    .keyBy(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(5)))
    .reduce(new Summer());

DataStream<Integer> globalResults = resultsPerKey
    .windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
    .process(new TopKWindowFunction());

在本例中,第一次操作的时间窗口[0,5)的结果也将在后续加窗操作的时间窗口[0,5)中结束。这允许计算每个键的和,然后在第二个操作中计算同一窗口内的top-k元素。

这篇文章有用吗?

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?