我正在使用Kafka Streams 1.0,我正在阅读Kstream [String,CustomObject]中的一个主题,然后我尝试选择一个来自CustomObject的一个成员的新密钥,代码如下所示:
myStream: KStream[String, CustomObject] = builder.stream("topic")
.mapValues {
...
//code to transform json to CustomObject
customObject
}
myStream.selectKey((k,v) => v.id)
.to("outputTopic", Produced.`with`(Serdes.String(),
customObjectSerde))
它给出了这个错误:
Error:(109, 7) overloaded method value to with alternatives:
(x$1: String,x$2: org.apache.kafka.streams.kstream.Produced[?0(in value x$1),com.myobject.CustomObject])Unit <and>
(x$1: org.apache.kafka.streams.processor.StreamPartitioner[_ >: ?0(in value x$1), _ >: com.myobject.CustomObject],x$2: String)Unit
cannot be applied to (String, org.apache.kafka.streams.kstream.Produced[String,com.myobject.CustomObject])
).to("outputTopic", Produced.`with`(Serdes.String(),
我无法理解错误。
希望有人可以帮助我。谢谢!
答案 0 :(得分:2)
Kafka Streams API广泛使用Java泛型类型,这使得Scala编译器难以正确推断类型。因此,您需要手动为某些情况指定类型,以避免模糊的方法重载。
我避免这个问题的好方法是不链接多个运算符,但在每次运算后引入一个新的KStream
变量:
// not this
myStream.selectKey((k,v) => v.id)
.to("outputTopic", Produced.`with`(Serdes.String(),customObjectSerde))
// but this
newStream: KStream[KeyType,ValueType] = myStream.selectKey((k,v) => v.id)
newStream.to("outputTopic", Produced.`with`(Serdes.String(),customObjectSerde))
顺便说一句:Kafka 2.0将为Kafka Streams(https://docs.confluent.io/current/streams/faq.html#scala-compile-error-no-type-parameter-java-defined-trait-is-invariant-in-type-t)提供适当的Scala API,以解决这些Scala问题。