重新分配时间戳,Flink中的水印?

时间:2019-02-08 00:20:49

标签: java apache-flink

考虑我这样做:

DataStream<POJO> ds = ...
ds.assignTimestampsAndWatermarks(CustomAssigner)
.windowAll(...)
.apply(someFunction) //THIS FUNCTION CHANGES THE TIMESTAMP FIELD IN THE EVENTS
.assignTimestampsAndWatermarks(AnotherCustomAssigner)

这有效吗?我不知道水印/时间戳是全局的还是仅保留在数据流中?

修改

class POJO{
   int timestamp;
   String someDetail; //key by this
   ...
}

DataStream ds = ....

ds.assignTimeStampsAndWatermarks(new AssignerWithPunctuatedWatermarks(){
   long maxTS = Long.MIN_VALUE;
   Watermarks checkAndGetNextWater(POJO, p, long l){
  maxTS = max(...)
  return new Watermarks(maxTS);
}

long ExtractTS(POJO p, long l){
  maxTS = max(...)
  return p.timeStamp;
}


  }).keyBy(someDetail property)
     .window(TumblingWindow(1 min))
      .apply(new AllWindowFunction<POJO, POJO, String, TimeWindow>(){
  public void apply(...){
    POJO newPOJO = ...;
    for(POJO it : iterable){
      newPOJO.timeStamp += ...
    }
    collector.collect(newPOJO);
  }
}) 

现在我想知道

如果由于我想先执行windowAll然后再次执行apply,而应该再次分配时间戳记。

assignTimestamp...
.windowAll(..)
.apply(some other allwindow function)

1 个答案:

答案 0 :(得分:0)

不希望您再次调用assignTimestampsAndWatermarks。 Flink将忽略WindowFunction创建的POJO中的时间戳,并使用从该窗口末尾的时间得出的时间戳对流式记录进行时间戳记。尽管后续窗口需要覆盖一个时间范围,该时间范围是第一个时间的整数倍,但通常情况下这很好。

如果您试图构造一个全新的流,该流应该重新标记并具有自己的新水印,则可以再次调用assignTimestampsAndWatermarks。