2017-05-04 94 views
0

我有我的星火流应用程序下面的行编译罚款:为什么Scala编译器会因“无法解析带有这种签名的引用reduceByKeyAndWindow”而失败?

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

当我使用的reduceByKeyAndWindow变异有两个Duration S作为如下:

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

我面对的下方编译器错误:

Cannot resolve reference reduceByKeyAndWindow with such signature

为什么?

回答

0

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

看来,隐含范围不提供有关类型,因此误差足够的知识:

missing parameter type for expanded function ((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类型推理)。

相关问题