让我们说我有一个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();
现在,我想结合流countStream和maxStream来找到所有时间戳,最后一秒的countStream等于maxStream。
注意: 这并不是我要解决的问题,但这是一个典型的例子。解决这个问题将帮助我解决需要解决的实际问题。
答案 0 :(得分:0)
如果时间窗口是事件时间窗口,则它们发出的事件将被标记为发生在窗口末尾。在处理时间窗口的情况下,事件将没有时间戳,CPU时间时钟将用作计时信息的来源。
更新:
Flink中的时间窗口与纪元对齐-它们与第一个事件或类似事件无关。您可以确保两个具有相同持续时间和偏移量的事件时间窗口(例如,两个一秒长的翻滚窗口)将在完全相同的时间间隔内收集事件。
事件时间窗口发出的事件流本身就是带有事件时间时间戳的流,并且可以像其他带有时间戳的事件流一样进一步进行窗口化。请记住,一个窗口实例产生的所有事件(即同一秒)都将具有相同的时间戳。因此,如果您在一个1秒的窗口中跟随一个较短的窗口(例如100毫秒),那么在10个窗口中有9次较短的窗口将看不到任何事件。
答案 1 :(得分:0)
更新:
如果您希望来自同一上游窗口的元素最终位于同一下游窗口中。您可以使用Consecutive windowed operation。
步骤:
union
将 countStream 与 maxStream 组合。
windowAll
显示合并的流。process
之后执行某些windowAll
函数来执行业务逻辑。