我想减少 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/