加入Kafka Streams时如何访问原始记录

时间:2019-04-15 21:04:33

标签: java apache-kafka apache-kafka-streams

我有一个可使用的Kafka Streams应用程序,该应用程序当前正在根据两个不同的主题创建两个KStreams。那部分工作正常。

现在,我想加入它们,并在第一个值和第二个值中获得值的“汇总记录”。键是简单的Java字符串,值是经过Avro编码的GenericRecords。

根据文档,我应该能够执行以下操作:

    KStream<String, GenericAvroSerde> joined =
        inputTopicStartKStream.leftJoin(inputTopicEndKStream,
        (left, right) -> { ??? }
        JoinWindows.of(Duration.ofHours(24)),
        Joined.with(
            stringSerde,
            genericAvroSerde,
            genericAvroSerde)
    );

但是,在网上找到的文档或教程尚不清楚,在上面{ ??? }部分中我可以做什么。我已经尝试了上述方法的多种变体,但是没有运气。如果有问题,我正在使用Kakfa Streams 2.2.0版本。

我只是想拥有一个<key, merge value1 + value2>的输出流,用于记录具有相同键的两个流上的记录。我可以手动合并值,但是还不清楚如何访问lambda右侧的值。

1 个答案:

答案 0 :(得分:3)

在ValueJoiner (left, right) -> { ??? }中,表示左流的值,表示右流的值

您所要做的就是,将代码添加到ValueJoiner中,如下所示:

import org.apache.avro.generic.GenericData.Record;
import org.apache.avro.generic.GenericRecord;

KStream<String, GenericAvroSerde> joined =
    inputTopicStartKStream.leftJoin(inputTopicEndKStream,
    (left, right) -> {
             // You can get access to the generic Avro record by
             // casting both left and right values 
             Record leftRecord = (Record) left;
             Record rightRecord = (Record) right;

             // For the original question, you can simply create a new GenericRecord 
             // with the contents of left and right records
             GenericRecord record = new GenericData.Record(schema);
             record.put("left", left);
             record.put("right", right);
    }
    JoinWindows.of(Duration.ofHours(24)),
    Joined.with(
        stringSerde,
        genericAvroSerde,
        genericAvroSerde)
);