通过Window操作在DataStream中创建上下文时间戳

时间:2019-03-22 11:20:05

标签: java apache-flink flink-streaming flink-cep

让我们说我有一个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。

注意: 这并不是我要解决的问题,但这是一个典型的例子。解决这个问题将帮助我解决需要解决的实际问题。

2 个答案:

答案 0 :(得分:0)

如果时间窗口是事件时间窗口,则它们发出的事件将被标记为发生在窗口末尾。在处理时间窗口的情况下,事件将没有时间戳,CPU时间时钟将用作计时信息的来源。

更新:

Flink中的时间窗口与纪元对齐-它们与第一个事件或类似事件无关。您可以确保两个具有相同持续时间和偏移量的事件时间窗口(例如,两个一秒长的翻滚窗口)将在完全相同的时间间隔内收集事件。

事件时间窗口发出的事件流本身就是带有事件时间时间戳的流,并且可以像其他带有时间戳的事件流一样进一步进行窗口化。请记住,一个窗口实例产生的所有事件(即同一秒)都将具有相同的时间戳。因此,如果您在一个1秒的窗口中跟随一个较短的窗口(例如100毫秒),那么在10个窗口中有9次较短的窗口将看不到任何事件。

答案 1 :(得分:0)

  • 对于基于事件时间的滚动窗口,间隔为1秒。我们来看看 [start_ts,end_ts)中有一个窗口范围,它会发出带有时间戳记 end_ts-1 的结果(也就是说, start_ts-999 < / em>原因 end_ts 等于 start_ts + 1000 )。
  • 对于基于进程时间的senoraios,没有时间戳信息。生成。

更新:

如果您希望来自同一上游窗口的元素最终位于同一下游窗口中。您可以使用Consecutive windowed operation

步骤:

    通过union countStream maxStream 组合。
  1. windowAll显示合并的流。
  2. process之后执行某些windowAll函数来执行业务逻辑。