2017-05-04 93 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類型推理)。

相關問題