如何在Spark

时间:2016-05-13 08:19:00

标签: apache-spark

我想在Spark中生成带有norm 1的随机向量。

由于向量可能非常大,我希望它是分布式的,并且由于RDD中的数据没有顺序,我想以RDD [(Int,Double)]的形式存储向量,因为我还需要使用此向量进行矩阵向量乘法。

那我怎么能产生这种载体呢?

这是我现在的计划:

val v = normalRDD(sc, n, NUM_NODE)
val mod = GetMod(v)       // Get the modularity of v
val res = v.map(x => x / mod)
val arr:Array[Double] = res.toArray()

var tuples = new List[(Int, Double)]()
for (i <- 0 to (arr.length - 1)) {
  tuples = (i, arr(i)) :: tuples
}
// Get the entries and length of the vector.
entries = sc.parallelize(tuples)
length = arr.length

我认为它不够优雅,因为它经历了一个&#34;分布式 - &gt;单节点 - &gt;分布式&#34;过程

有没有更好的方法?感谢:d

2 个答案:

答案 0 :(得分:1)

试试这个:

import scala.util.Random
import scala.math.sqrt

val n = 5 // insert length of your array here
val randomRDD = sc.parallelize(for (i <- 0 to n) yield (i, Random.nextDouble))
val norm = sqrt(randomRDD.map(x => x._2 * x._2).sum())
val finalRDD = randomRDD.mapValues(x => x/norm)

答案 1 :(得分:0)

您可以使用this函数生成随机向量,然后您可以通过划分向量的sum()上的每个元素或使用normalizer来对其进行标准化。