gpt4 book ai didi

java - 在 Flink 中重新分配时间戳、水印?

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:11 29 4
gpt4 key购买 nike

考虑我这样做:

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
...
}

数据流 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,然后再次应用

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

最佳答案

您不需要再次调用 allocateTimestampsAndWatermarks。 Flink 将忽略 WindowFunction 创建的 POJO 中的时间戳,并使用从该窗口末尾的时间派生的时间戳对包装这些事件的流记录添加时间戳。通常这工作得很好,尽管后续窗口需要覆盖第一个窗口的整数倍的时间范围。

如果您尝试构建一个全新的流,该流应该重新加时间戳并具有自己的新水印,那么再次调用 allocateTimestampsAndWatermarks 可能会起作用。

关于java - 在 Flink 中重新分配时间戳、水印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54584383/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com