考虑我这样做:
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)
答案 0 :(得分:0)
不希望您再次调用assignTimestampsAndWatermarks。 Flink将忽略WindowFunction创建的POJO中的时间戳,并使用从该窗口末尾的时间得出的时间戳对流式记录进行时间戳记。尽管后续窗口需要覆盖一个时间范围,该时间范围是第一个时间的整数倍,但通常情况下这很好。
如果您试图构造一个全新的流,该流应该重新标记并具有自己的新水印,则可以再次调用assignTimestampsAndWatermarks。