【问题标题】:Why does Scala compiler fail with “Cannot resolve reference reduceByKeyAndWindow with such signature”?为什么 Scala 编译器会因“无法解析具有此类签名的引用 reduceByKeyAndWindow”而失败?
【发布时间】:2017-05-04 19:07:41
【问题描述】:

我的 Spark Streaming 应用程序中有以下行可以正常编译:

val kafkaDirectStream: InputDStream[ConsumerRecord[String,String]] = KafkaUtils.createDirectStream(...)
kafkaDirectStream.map(_ => ("mockkey", 1)).reduceByKeyAndWindow(_+_, Seconds(30))

当我使用reduceByKeyAndWindow 的变体和两个Durations 时,如下所示:

.reduceByKeyAndWindow(_ + _, Seconds(30), Seconds(10))

我面临以下编译器错误:

无法解析具有此类签名的引用 reduceByKeyAndWindow

为什么?

【问题讨论】:

    标签: scala apache-spark apache-kafka spark-streaming


    【解决方案1】:

    kafkaDirectStream.map(_ => ("mockkey", 1)) 之后,您将拥有DStream[(String, Int)](您可以在org.apache.spark.streaming.dstream.DStream 的官方文档中阅读)。

    似乎隐式范围没有提供关于类型的足够知识,因此错误:

    扩展函数缺少参数类型 ((x$3, x$4) => x$3.$plus(x$4))

    不幸的是,我无法真正解释编译错误的根本原因是什么,但解决方案是定义一个具有明确指定类型的方法或函数并使用它(不是单独的下划线,即_ + _) .

    val add: (Int, Int) => Int = _ + _
    // or def add(x: Int, y: Int) = x + y
    mapped.reduceByKeyAndWindow(add, Seconds(30), Seconds(10))
    

    这将通过 Scala 编译器。

    (希望我知道是否有更好的解决方案以某种方式帮助 Scala 类型推断器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2019-08-23
      相关资源
      最近更新 更多