由窗口操作创建的数据流中的java上下文时间戳

lnvxswe2  于 2021-06-21  发布在  Flink
关注(0)|答案(2)|浏览(302)

假设我有一个inputstream,我对它执行了一些窗口操作。通过对事件执行窗口操作而创建的事件的时间戳是什么。

....
DataStream<Integer> inputStream = // ...
DataStream<Integer> countStream = inputStream.keyBy(0)
    .timeWindow(time.Seconds(1))
    .sum();
DataStream<Integer> maxStream = inputStream.keyBy(0)
    .timeWindow(time.Seconds(1))
    .max();

现在,我想将streams countstream和maxstream组合起来,以找到countstream最后一秒等于maxstream的所有时间戳。
注意:这并不是我要解决的问题,但这是一个有代表性的例子。解决这个问题将帮助我解决真正需要解决的问题。

7ivaypg9

7ivaypg91#

对于间隔为1秒的基于事件时间的翻滚窗口。让我们看看在[start\u ts,end\u ts]中有一个窗口范围,它将发出带有时间戳end\u ts-1的结果(也就是说start\u ts-999,因为end\u ts等于start\u ts+1000)。
对于基于进程时间的senoraios,没有时间戳信息。生成。
更新:
如果希望来自同一上游窗口的元素最终位于同一下游窗口中。您可以使用连续窗口操作。
步骤:
将countstream与maxstream合并 union .
组合流的窗口 windowAll .
你的商业逻辑在一些 process 函数跟随 windowAll .

2lpgd968

2lpgd9682#

在时间窗口是事件时间窗口的情况下,它们发出的事件将被时间戳为发生在窗口末尾。在处理时间窗口的情况下,事件将不具有时间戳,并且将使用cpu时间时钟作为定时信息的源。
更新:
flink中的时间窗口与时代对齐——它们与第一个事件或类似事件无关。可以保证具有相同持续时间和偏移量的两个事件时间窗口(例如,两个1秒长的翻滚窗口)将收集完全相同时间间隔的事件。
由事件时间窗口发出的事件流本身是具有事件时间戳的流,并且可以像任何其他时间戳的事件流一样被进一步窗口化。请记住,一个窗口示例(即,对于同一秒)生成的所有事件都将具有相同的时间戳。因此,如果你在一个1秒的窗口中使用一个较短的窗口,例如100毫秒,那么10次中有9次较短的窗口将看不到任何事件。

相关问题