以下错误中找到和需要的区别是什么

时间:2018-04-01 04:52:37

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

在处理Scala Kafka KeyValueMapper时,我遇到了以下错误。我不确定究竟是什么区别。 谢谢你的帮助。

代码:

  1. 我从主题创建了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")
    
  2. 当我尝试使用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)
          }
        }
      )
    
  3. [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]
    

1 个答案:

答案 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],然后它才起作用。