我正在尝试运行以下示例中的基本应用程序:
但是我在这一行得到例外:
// 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很新。我想知道问题是什么以及如何解决它。
答案 0 :(得分:2)
此问题的根本原因是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