我正在为CCA175做准备,我正在使用最新版本的spark,Spark 1.3.0。
如下所示,我在映射时将元素转换为Float,但减少它时显示编译时错误。
scala> val revenuePerDay = ordersJoinOrderItems.map(x => (x._2._1, (x._1, (x._2._2).toFloat)))
revenuePerDay: org.apache.spark.rdd.RDD[(String, (Int, Float))] =
MapPartitionsRDD[21] at map at <console>:31
映射后我可以看到它被映射为Float
但是当我运行以下命令时它显示错误:
scala> revenuePerDay.reduceByKey((x,y) => x._2._2 + y._2._2)
<console>:34: error: value _2 is not a member of Float
revenuePerDay.reduceByKey((x,y) => x._2._2 + y._2._2)
^
答案 0 :(得分:2)
PairRDDFunctions.reduceByKey
适用于一对值:
def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]
由于您的元组格式为(String, (Int, Float))
,因此键(String
)不是方法签名的一部分。
reduceByKey
需要(V, V) => V
类型的函数。由于您的输入类型为(Int, Float)
,结果类型为Float
,因此无效。
相反,我们需要使用更详细的PairRDDFunctions.combineByKey
:
revenuePerDay.combineByKey[Float](_._2, (acc, x) => acc + x._2, (x, y) => x + y)
或者,您可以使用略微相似的PairRDDFunctions.aggregateByKey
:
revenuePerDay.aggregateByKey(0F)((acc, x) => acc + x._2, (x, y) => x + y)
@ zero323的另一个建议是mapValues
使用reduceByKey
:
revenuePerDay.mapValues(_._2).reduceByKey(_ + _)