如何更改KStream的密钥然后使用Scala写入主题?

时间:2018-04-05 21:34:52

标签: scala apache-kafka-streams

我正在使用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(),

我无法理解错误。

希望有人可以帮助我。谢谢!

1 个答案:

答案 0 :(得分:2)

Kafka Streams API广泛使用Java泛型类型,这使得Scala编译器难以正确推断类型。因此,您需要手动为某些情况指定类型,以避免模糊的方法重载。

还要比较:OpenSSL documentation

我避免这个问题的好方法是链接多个运算符,但在每次运算后引入一个新的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问题。