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是可选的,只存在于保持矩阵的一半(不包括对角),因为它是对称的,因此多余的,如果你想要完整的列表只是将其删除。