1

名稱我計算在火花一個相關矩陣和我想提取組合單個的相關性與它們的列名。行/列從相關矩陣值在火花

相關矩陣

correlMatrix: org.apache.spark.mllib.linalg.Matrix = 
1.0     -0.33333333333333254 -0.8164965809277261 -0.7777777777777787 
-0.33333333333333254 1.0     0.8164965809277356 -0.33333333333333254 
-0.8164965809277261 0.8164965809277356 1.0     0.27216552697591645 
-0.7777777777777787 -0.33333333333333254 0.27216552697591645 1.0 

Datafarme名稱

colNames: Array[String] = Array(item_1, item_2, item_3, item_4) 

現在我想每個組合成數據幀提取結構如下:

item_from | item_to | Correlation 
item_1 | item_2 | -0.0096912 
item_1 | item_3 | -0.7313071 
item_2 | item_3 | 0.68910356 

或者至少整個相關矩陣列名:

  item_1    item_2    item_3   item_4 
item_1  1.0     -0.33333333333333254 -0.8164965809277261 -0.7777777777777787 
item_2  -0.33333333333333254 1.0     0.8164965809277356 -0.33333333333333254 
item_3  -0.8164965809277261 0.8164965809277356 1.0     0.27216552697591645 
item_4  -0.7777777777777787 -0.33333333333333254 0.27216552697591645 1.0 

我試圖寫一個地圖功能,但如我所料沒有奏效。

有沒有,你可以提出任何解決辦法嗎?

回答

1
val colNamePairs = colsNames.flatMap(c1 => colsNames.map(c2 => (c1, c2))) 

val triplesList = colNamePairs.zip(correlMatrix.toArray) 
    .filterNot(p => p._1._1 >= p._1._2) 
    .map(r => (r._1._1, r._1._2, r._2)) 

val corrDF = sc.parallelize(triplesList).toDF("item_from", "item_to", "Correlation") 

colNamePairs產生列名的所有組合 triplesList代表由(colName1,colName2,相關性)組成的三元組的列表

最後,我們把它轉換爲DF與追捧列名稱。

請注意filterNot是可選的,只存在於保持矩陣的一半(不包括對角),因爲它是對稱的,因此多餘的,如果你想要完整的列表只是將其刪除。