2015-12-30 82 views
3

我想創造一些元組共生矩陣一共生矩陣,見下圖:如何創建一個Spark RDD

val rdd = sc.parallelize(Array(
    Array("101","103","105"), Array("102","105"),Array("101","102","103","105")) 
val coocMatrix = new ArrayBuffer[(String, Int)]() 

// map 
rdd.collect().foreach(x => 
    { for(i <- 0 to x.length-1) 
    { for(j <- i+1 to x.length-1) 
    { coocMatrix += (x(i)+"#"+x(j), 1) }} 

// convert to rdd again 
val rdd2 = sc.parallelize(coocMatrix) 

// reduce 
vall matrix = rdd2.collect().groupByKey() 

所以我們得到以下數據終於

(101#103,2),(101#105,2),(102#105,2),(101#102,1), 
(103#105,2),(102#103,1),(102#105,1) 

這個算法非常慢,因爲它是O(n * n),當有200萬個元組時它是不可行的。有沒有算法來計算這個共生矩陣?

回答

4

combinations方法允許您提取給定數組中出現的對的列表。之後,你可以減少密鑰

rdd.flatMap{_.combinations(2).map{pairs=>(pairs.mkString("#"),1)}}. 
    reduceByKey(_+_) 
+0

這個工作,並且比2迴路快得多!驚人!非常感謝! – victorming888

相關問題