我是kafka的新手。我试图将kafka流(命名为 inputStream )加入到kafka-table(命名为 detailTable )中,其中kafka-stream的构建方式为:
//The consumer to consume the input topic
Consumed<String, NotifyRecipient> inputNotificationEventConsumed = Consumed
.with(Constants.CONSUMER_KEY_SERDE, Constants.CONSUMER_VALUE_SERDE);
//Now create the stream that is directly reading from the topic
KStream<NotifyKey, NotifyVal> initialInputStream =
streamsBuilder.stream(properties.getInputTopic(), inputNotificationEventConsumed);
//Now re-key the above stream for the purpose of left join
KStream<String, NotifyVal> inputStream = initialInputStream
.map((notifyKey,notifyVal) ->
KeyValue.pair(notifyVal.getId(),notifyVal)
);
通过以下方式创建kafka表:
//The consumer for the table
Consumed<String, Detail> notifyDetailConsumed =
Consumed.with(Serdes.String(), Constants.DET_CONSUMER_VALUE_SERDE);
//Now consume from the topic into ktable
KTable<String, Detail> detailTable = streamsBuilder
.table(properties.getDetailTopic(), notifyDetailConsumed);
现在,我尝试以以下方式将 inputStream 加入 detailTable :
//Now join
KStream<String,Pair<Long, SendCmd>> joinedStream = inputStream
.leftJoin(detailTable, valJoiner)
.filter((key,value)->value!=null);
我收到一个错误,似乎在连接过程中尝试 inputStream 的键和值投射到默认键序列和默认值序列,并获得类强制转换异常。
不确定如何解决此问题,并在那里需要帮助。 让我知道是否需要提供更多信息。
答案 0 :(得分:1)
由于使用的是map()
,因此键和值类型可能会发生变化,因此需要通过Joined.with(...)
指定正确的Serdes作为.leftJoin()
的第三个参数。