scala - 有没有更好的方法对 RDD[Array[Double]] 进行归约操作

标签 scala apache-spark reduce rdd

我想减少 RDD[Array[Double]] 以便数组的每个元素将与下一个数组的相同元素相加。 我暂时使用此代码:

var rdd1 = RDD[Array[Double]]

var coord = rdd1.reduce( (x,y) => { (x, y).zipped.map(_+_) })

有没有更好的方法可以更有效地做到这一点,因为它会造成伤害。

最佳答案

使用 zipped.map 效率非常低,因为它会创建大量临时对象并将 double 装箱。

如果您使用spire ,你可以这样做

> import spire.implicits._
> val rdd1 = sc.parallelize(Seq(Array(1.0, 2.0), Array(3.0, 4.0)))
> var coord = rdd1.reduce( _ + _)
res1: Array[Double] = Array(4.0, 6.0)

这看起来更漂亮,而且效率也应该更高

Spire 是 Spark 的依赖项,因此您应该能够在没有任何额外依赖项的情况下执行上述操作。至少它可以与 Spark 1.3.1 的 Spark-Shell 一起使用。

这适用于任何有可用于元素类型的 AdditiveSemigroup 类型类实例的数组。在本例中,元素类型为 Double。 Spire 类型类是 @specialized for double,因此任何地方都不会发生拳击。

如果你真的想知道如何实现这项工作,你必须使用 reify:

> import scala.reflect.runtime.{universe => u}
> val a = Array(1.0, 2.0)
> val b = Array(3.0, 4.0)
> u.reify { a + b }

res5: reflect.runtime.universe.Expr[Array[Double]] = Expr[scala.Array[Double]](
  implicits.additiveSemigroupOps(a)(
    implicits.ArrayNormedVectorSpace(
      implicits.DoubleAlgebra, 
      implicits.DoubleAlgebra,
      Predef.this.implicitly)).$plus(b))

所以加法有效,因为有一个 Array[Double] 的 AdditiveSemigroup 实例。

关于scala - 有没有更好的方法对 RDD[Array[Double]] 进行归约操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31026191/

相关文章:

java - Play框架文件上传无此类文件异常

apache-spark - Spark 。如何开始理解下面的执行计划

java - 尽管spark.executor.cores=1,Apache Spark 执行器仍使用多个核心

scala - Scala 中的 Foreach 与 Map

scala - 谓词成立时重复调用函数

java - Scala foreach 返回

java - 用IntelliJ运行Java Spark

Clojure:使用输出作为下一个操作的输入执行操作 n 次(a-la reduce)

java-8 - 在 stream.reduce 之后是否有更优雅的方式来切断主角?

hadoop - hadoop reduce任务如何处理 map 分组数据