我想在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
答案 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来对其进行标准化。