2016-05-13 30 views
0

我想在Spark中生成規範爲1的隨機向量。由於矢量可能非常大,我希望它是分佈式的,並且由於RDD中的數據沒有順序,因此我想以RDD [(Int,Double)]的形式存儲矢量,因爲我也是需要使用這個向量來做一些矩陣向量乘法。如何在Spark中生成隨機向量

那麼我怎麼能生成這種矢量?

這是我的計劃,現在:

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 

我認爲這還不夠優雅,因爲它會經過一個「分散 - >單節點 - >分佈」的過程。

有沒有更好的辦法?謝謝:d

+0

你想要一個隨機的rdd,其規範是1還是正態分佈的rdd? – jtitusj

+0

@JohnTitusJungao我想我只是想要一個隨機rdd,其規範是1.正常分佈是好的根據我的代碼:D –

+0

我明白了。我在下面發佈了我的代碼。最終答案的格式爲:RDD [(Int,Double)],隨機生成並且規範爲1. – jtitusj

回答

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) 
+0

感謝您的幫助:D –

0

可以使用this函數產生一個隨機向量,那麼你可以通過將在載體的sum()每個元素,或者通過使用normalizer正常化它。