2016-03-03 112 views
2

我在Scala中有一个任务,到目前为止,这么好。一切编译除了这一点:Scala mapValues()类型不匹配

@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: error: type mismatch;

found : (Double, Long) => Double

required: ((Double, Long)) => ?

任何人都可以点我在正确的方向?

+0

我想也许是因为'mapValues'你给了你的输入一个特定的情况,但是如果它是默认情况,它会返回什么? –

回答

4

您提供了一个带有两个参数的函数,一个参数为Double和一个参数为Long,而不是带有一个参数的函数 - 一个元组(Double, Long)。如果你需要一个元组作为参数,使用

.mapValues { case (x: Double,y: Long) => whatever } 

请注意,你需要围绕case{},而不是()

+0

但是,您不需要双括号。 –

+0

啊对,固定。 – slouc

1

作为替代slouc的回答是:
您可以使用untupeld

import Function.untupled 

Map.empty mapValues untupled myMethodWithMultipleArguments 

总之,提防mapValues的,因为它只是创建了一个view