如何用Apache spark计算平均值?

时间:2014-07-11 09:21:29

标签: java scala apache-spark apache-spark-mllib

我处理了像这样存储的Double列表:

JavaRDD<Double> myDoubles

我想计算此列表的平均值。 根据{{​​3}},:

  

所有MLlib的方法都使用Java友好类型,因此您可以像在Scala中一样导入和调用它们。唯一需要注意的是,这些方法使用Scala RDD对象,而Spark Java API使用单独的JavaRDD类。您可以通过在JavaRDD对象上调用.rdd()将Java RDD转换为Scala。

在同一页面上,我看到以下代码:

val MSE = valuesAndPreds.map{case(v, p) => math.pow((v - p), 2)}.mean()

根据我的理解,这相当于(在类型方面)

Double MSE = RDD<Double>.mean()

因此,我尝试像这样计算JavaRDD的平均值:

myDoubles.rdd().mean()

但是,它不起作用并给我以下错误:The method mean() is undefined for the type RDD<Double>。我也没有在documentation中找到这个功能的提及。 。这是因为对我方的理解不好,还是这个呢?

2 个答案:

答案 0 :(得分:10)

实际上很简单:为mean()类定义了JavaDoubleRDD。我没有找到如何从JavaRDD<Double>投射到JavaDoubleRDD,但就我而言,没有必要。

确实,scala中的这一行

val mean = valuesAndPreds.map{case(v, p) => (v - p)}.mean()

可以用Java表示为

double mean = valuesAndPreds.mapToDouble(tuple -> tuple._1 - tuple._2).mean();

答案 1 :(得分:0)

不要忘记在scala文件的顶部添加import org.apache.spark.SparkContext._。 另外,请务必在mean()

上致电RDD[Double]