我处理了像这样存储的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中找到这个功能的提及。
。这是因为对我方的理解不好,还是这个呢?
答案 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]