在处理Scala Kafka KeyValueMapper
时,我遇到了以下错误。我不确定究竟是什么区别。
谢谢你的帮助。
代码:
我从主题创建了KTable
。
val creducer: Reducer[java.lang.Long] =
(v1, v2) => if (v1 > v2) v1 else v2
val deduplicationWindow = TimeWindows
.of(60000L * 10)
.advanceBy(60000L)
.until(60000L * 10)
val ktwindow: KTable[Windowed[String], java.lang.Long] =
ipandTime
.groupByKey(Serdes.String(), Serdes.Long())
.reduce(creducer, deduplicationWindow, "ktwindow-query")
当我尝试使用Windowed[String]
的密钥创建流时,我在使用selectKey方法时遇到错误。 java中的类似实现工作正常。
val fStream = ktwindow
.toStream()
.selectKey(
new KeyValueMapper[Windowed[String],
java.lang.Long,
KeyValue[String, java.lang.Long]] {
override def apply(
key: Windowed[String],
value: java.lang.Long): KeyValue[String, java.lang.Long] = {
new KeyValue(key.key(), value)
}
}
)
[error] found : org.apache.kafka.streams.kstream.KeyValueMapper[org.apache.kafka.streams.kstream.Windowed[String],Long,org.apache.kafka.streams.KeyValue[String,Long]]
[error] required: org.apache.kafka.streams.kstream.KeyValueMapper[_ >: org.apache.kafka.streams.kstream.Windowed[String], _ >: Long, _ <: KR]
答案 0 :(得分:0)
变量ipandTime
无处可寻,所以我用???
替换了它,但这与实际问题没有任何关系。
正如我所说,如果Java使用站点通配符的类型推断失败,那么只需添加显式类型参数。这里编译为Kafka 1.1.0:
import org.apache.kafka.streams.kstream._
import org.apache.kafka.common.serialization._
import org.apache.kafka.streams.KeyValue
object Q49594920 {
val creducer: Reducer[java.lang.Long] =
(v1, v2) => if (v1 > v2) v1 else v2
val deduplicationWindow = TimeWindows
.of(60000L * 10)
.advanceBy(60000L)
.until(60000L * 10)
val ktwindow: KTable[Windowed[String], java.lang.Long] = ???
// ipandTime // What's that? It's not defined anywhere!
// .groupByKey(Serdes.String(), Serdes.Long())
// .reduce(creducer, deduplicationWindow, "ktwindow-query")
val fStream = ktwindow
.toStream()
.selectKey[KeyValue[String, java.lang.Long]](
new KeyValueMapper[Windowed[String],
java.lang.Long,
KeyValue[String, java.lang.Long]] {
override def apply(
key: Windowed[String],
value: java.lang.Long): KeyValue[String, java.lang.Long] = {
new KeyValue(key.key(), value)
}
}
)
}
selectKey
方法想要一个泛型类型参数KR
,所以我只给它具体的类型KeyValue[String, java.lang.Long]
,然后它才起作用。