【问题标题】:How to compute the mean with Apache spark?如何用 Apache spark 计算平均值?
【发布时间】:2014-09-01 21:02:33
【问题描述】:

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

JavaRDD<Double> myDoubles

我想计算这个列表的平均值。 根据documentation,:

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&lt;Double&gt;。我也没有在RDD scala documentation 中找到提及此功能。 .这是因为对我这边的了解不够,还是另有原因?

【问题讨论】:

  • 你是什么意思“它不起作用”?这是您看到的具体错误消息吗?
  • 谢谢! Scala就是这样疯狂。 mean 方法在 DoubleRDDFunctions 上,但可以在 RDD[Double] 上使用。它也在JavaDoubleRDD,所以这就是你需要得到的。
  • (我不知道Java API,所以我不能更具体,抱歉。)
  • 太棒了!我宁愿把答案留给你。我什至不知道如何测试那条线。

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


【解决方案1】:

其实很简单:mean() 是为JavaDoubleRDD 类定义的。我没有找到如何从JavaRDD&lt;Double&gt; 转换为JavaDoubleRDD,但就我而言,没有必要。

确实,scala中的这一行

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

在Java中可以表示为

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

【讨论】:

    【解决方案2】:

    不要忘记在 scala 文件的顶部添加 import org.apache.spark.SparkContext._。 还要确保你在RDD[Double]上调用mean()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多