到目前为止,我在Scala中有一项任务,非常好。除此之外,所有内容都会编译:
@transient val aggs = msgs.transform { rdd =>
val ts = rdd.map(quote => quote.ts).max() /// maximum of timestamp in the rdd
rdd.map{ q =>
((q.symbol,q.ts),(q.price,ts)) /// ((String, Long), (Double, Long)) structure
}
}
.reduceByKey{ (x,y) => (x._1 + y._1, x._2 + y._2) } // returns (Double, Long)
.mapValues( (x: Double,y: Long) => (y.toDouble / x.toDouble) ) // (Double, Long) => (Double)
.map{ case ((s,t),v) => (s,t,v)}
我坚持的作品是mapValues()
中的匿名函数:95:错误:类型不匹配;
发现:( Double,Long)=>双
必需:((Double,Long))=> ?
有人能指出我正确的方向吗?
答案 0 :(得分:4)
您提供了一个带有两个参数的函数,一个Double
和一个Long
,而不是一个带有一个参数的函数 - 一个元组(Double, Long)
。如果你需要一个元组作为参数,请使用
.mapValues { case (x: Double,y: Long) => whatever }
请注意,您需要将case
括起来{}
而不是()
。
答案 1 :(得分:1)
作为slouc的回答的替代方案:
你可以使用untupeld
import Function.untupled
Map.empty mapValues untupled myMethodWithMultipleArguments
无论如何,要小心mapValues,因为它只是创建了一个view。