Java 如何连接两个卡夫卡流并在具有Avro值的主题中生成结果

Java 如何连接两个卡夫卡流并在具有Avro值的主题中生成结果,java,apache-kafka,apache-kafka-streams,ksqldb,Java,Apache Kafka,Apache Kafka Streams,Ksqldb,我有两个Kafka流,其中键为String,值为Avro格式,我使用KSQL创建了它们 这是第一个: DESCRIBE EXTENDED STREAM_1; Type : STREAM Key field : IDUSER Timestamp field : Not set - using <ROWTIME> Key format : STRING Value format : AV

我有两个Kafka流,其中键为
String
,值为
Avro
格式,我使用KSQL创建了它们

这是第一个:

DESCRIBE EXTENDED STREAM_1; 
Type                 : STREAM
Key field            : IDUSER
Timestamp field      : Not set - using <ROWTIME>
Key format           : STRING
Value format         : AVRO
Kafka output topic   : STREAM_1 (partitions: 4, replication: 1)

 Field                      | Type
--------------------------------------------------------
 ROWTIME                    | BIGINT           (system)
 ROWKEY                     | VARCHAR(STRING)  (system)
 FIRSTNAME                  | VARCHAR(STRING)
 LASTNAME                   | VARCHAR(STRING)
 IDUSER                     | VARCHAR(STRING)
但是,

KStream<String, GenericRecord> joined = ...

当我尝试对键和值使用
字符串
Serde
时,它可以工作,但从
卡夫卡控制台消费者
读取的数据不是那么容易。我想做的是以AVRO格式生成数据,以便能够使用
kafka AVRO console consumer
读取数据

我的第一个猜测是,您正在从join操作返回一个
字符串
,而您的代码预期会返回一个
genericord
,结果是:

KStream join=left.leftJoin(右、,
(leftValue,rightValue)->“left=“+leftValue+”,right=“+rightValue,…)

注意
连接的
如何具有类型
KStream
,即值具有类型
genericord
,但是连接输出是通过
“left=“+leftValue+”,right=“+rightValue
”)计算的,它具有类型
字符串
,而不是将值转换为字符串,您可以直接返回值。
例如:

KStream joined = left.leftJoin(right,
(leftValue, rightValue) -> { return rightValue});

谢谢你的回复。你能建议一个解决办法吗?如何从联接实例化GenericRecord,以便最终生成AVRO格式的值?我已经更新了我的问题,以包括两个流的实际字段,以便了解我正在尝试实现的内容。请查看AVRO API,了解如何实例化GenericRecord。这一步并不特定于卡夫卡流。如果需要的话,我建议为这个问题创建一个单独的问题。leftValue将是连接左侧的GenericRecord pojo(
STREAM_1
),rightValue将是右侧的GenericRecord pojo(
STREAM_2
)。有关如何访问字段,请参阅GenericRecord(在Avro中)的API。例如,您可以执行
leftValue.get(“FIRSTNAME”)
KStream<String, GenericRecord> joined = ...
incompatible types: inference variable VR has incompatible bounds
KStream joined = left.leftJoin(right,
(leftValue, rightValue) -> { return rightValue});