为什么Scala编译器失败并且“无法使用此类签名解析引用reduceByKeyAndWindow”?

时间:2017-05-04 08:01:03

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

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

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

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

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

我面对以下编译器错误:

  

无法使用此类签名解析引用reduceByKeyAndWindow

为什么?

1 个答案:

答案 0 :(得分:0)

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

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

  

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

不幸的是,我无法真正解释编译错误的根本原因是什么,但解决方案是使用显式指定的类型定义方法或函数并使用它(而不是单独使用下划线,即{{1} })。

_ + _

那将通过Scala编译器。

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