Apache beam 如何在apache beam中分配和检查消息的事件时间

Apache beam 如何在apache beam中分配和检查消息的事件时间,apache-beam,Apache Beam,我的源代码是一个KafkaIO.read(),现在我想使用ParDo来解码来自kafka的消息,并使用消息的一个字段作为此消息的事件时间。我怎么做?我没有找到任何关于如何执行的示例。首先,您需要通过扩展TimestampPolicy 例如: public class CustomFieldTimePolicy extends TimestampPolicy<String, Foo> { protected Instant currentWatermark; public Cus

我的源代码是一个
KafkaIO.read()
,现在我想使用ParDo来解码来自kafka的消息,并使用消息的一个字段作为此消息的事件时间。我怎么做?我没有找到任何关于如何执行的示例。

首先,您需要通过扩展
TimestampPolicy

例如:

public class CustomFieldTimePolicy extends TimestampPolicy<String, Foo> {


protected Instant currentWatermark;

public CustomFieldTimePolicy(Optional<Instant> previousWatermark) {
    currentWatermark = previousWatermark.orElse(BoundedWindow.TIMESTAMP_MIN_VALUE);
}


@Override
public Instant getTimestampForRecord(PartitionContext ctx, KafkaRecord<String, Foo> record) {
    currentWatermark = new Instant(record.getKV().getValue().getTimestamp());
    return currentWatermark;
}

@Override
public Instant getWatermark(PartitionContext ctx) {
    return currentWatermark;
}
此行负责创建一个新的timestampolicy,传递一个相关的分区和以前的检查点水印


你知道怎么做了吗?请分享你的发现,因为我目前面临同样的问题。
KafkaIO.<String, Foo>read().withBootstrapServers("http://localhost:9092")
                .withTopic("foo")
                .withKeyDeserializer(StringDeserializer.class)
                .withValueDeserializerAndCoder(KafkaAvroDeserializer.class, AvroCoder.of(Foo.class)) //if you use avro
                .withTimestampPolicyFactory((tp, previousWatermark) -> new CustomFieldTimePolicy(previousWatermark))
                .updateConsumerProperties(kafkaProperties))
withTimestampPolicyFactory(tp, previousWatermark) -> new CustomFieldTimePolicy(previousWatermark))