AssignerWithPunctuatedWatermarks是一种Watermark生成器,它在处理数据流时根据数据流自动产生Watermark。checkAndGetNextWatermark方法是其中的一个接口,其作用是检查数据并生成Watermark。它的定义如下:
public abstract WatermarkGeneratorSupplier createWatermarkGeneratorSupplier(
WatermarkGeneratorSupplier.Context context);
该方法的参数是WatermarkGeneratorSupplier.Context,这个类中包含了两个参数:
以下是一个示例代码,展示了如何正确地实现checkAndGetNextWatermark方法:
public class MyAssignerWithPunctuatedWatermarks
implements AssignerWithPunctuatedWatermarks {
@Override
public long extractTimestamp(String element, long previousElementTimestamp) {
// 返回数据的时间戳
return Long.parseLong(element.split(",")[0]);
}
@Override
public Watermark checkAndGetNextWatermark(
String lastElement,
long extractedTimestamp) {
// 提取数据的时间戳
long lastElementTimestamp = extractedTimestamp;
// 生成水印,此处水印的时间戳是数据时间戳减去5秒
long watermarkTimestamp = lastElementTimestamp - 5000;
return new Watermark(watermarkTimestamp);
}
}
在这个例子中, 在checkAndGetNextWatermark方法中,我们根据提取的数据时间戳(extractTimestamp
),计算出了一个比数据时间戳提前5秒的Watermark。这个Watermark会作为这个方法的返回值,更新当前水印(The current watermark)。这样,数据流中所有早于这个Watermark的数据都可以被认为是无效的。因此,当Watermark = T时,能保证数据时间戳小于T的事件已经都到达了。