在reduceByKey

时间:2016-09-03 14:46:56

标签: scala apache-spark

我正在为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)
                                                  ^

1 个答案:

答案 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(_ + _)