我有一个可使用的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右侧的值。
答案 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)
);