Kafka流过滤问题

时间:2017-08-24 12:57:56

标签: scala apache-kafka apache-kafka-streams

我正在尝试运行以下示例中的基本应用程序:

https://github.com/confluentinc/examples/blob/3.3.x/kafka-streams/src/main/scala/io/confluent/examples/streams/MapFunctionScalaExample.scala

但是我在这一行得到例外:

// Variant 1: using `mapValues`
val uppercasedWithMapValues: KStream[Array[Byte], String] = textLines.mapValues(_.toUpperCase())
  

错误:(33,25)缺少扩展函数的参数类型((x $ 1)=>   X $ 1.toUpperCase())       textLines.mapValues(_。toUpperCase())

如果我将光标悬停在代码上,我会收到错误:

  

类型不匹配,预期:ValueMapper [_>:String,_<:NotInferedVR],   实际:(任何)=>任何无法解析符号toUpperCase

我的sbt文件的内容:

name := "untitled1"

version := "0.1"

scalaVersion := "2.11.11"

// https://mvnrepository.com/artifact/org.apache.kafka/kafka_2.11
libraryDependencies += "org.apache.kafka" % "kafka_2.11" % "0.11.0.0"

// https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients
libraryDependencies += "org.apache.kafka" % "kafka-clients" % "0.11.0.0"

// https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams
libraryDependencies += "org.apache.kafka" % "kafka-streams" % "0.11.0.0"

// https://mvnrepository.com/artifact/org.apache.kafka/connect-api
libraryDependencies += "org.apache.kafka" % "connect-api" % "0.11.0.0"

我真的不确定如何继续这一点,因为我对Scala很新。我想知道问题是什么以及如何解决它。

1 个答案:

答案 0 :(得分:2)

来自http://docs.confluent.io/current/streams/faq.html#scala-compile-error-no-type-parameter-java-defined-trait-is-invariant-in-type-t

  

此问题的根本原因是Scala-Java互操作性 - Kafka Streams API是用Java实现的,但您的应用程序是用Scala编写的。值得注意的是,这个问题是由Java和Scala的类型系统如何交互引起的。例如,Java中的通用通配符通常会导致此类Scala问题。

     

要解决此问题,您需要在Scala应用程序中显式声明类型,以便编译代码。例如,您可能需要断开将多个DSL操作链接到多个语句的单个语句,其中每个语句显式声明相应的返回类型。 StreamToTableJoinScalaIntegrationTest演示了如何显式声明返回变量的类型。

<强>更新

Kafka 2.0(将于6月发布)包含一个适当的Scala API,可以避免这些问题。比较https://cwiki.apache.org/confluence/display/KAFKA/KIP-270+-+A+Scala+Wrapper+Library+for+Kafka+Streams