我的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
为什么?
答案 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类型推理器。)