Spark中相关矩阵值的行/列名称

时间:2017-04-20 08:55:04

标签: apache-spark apache-spark-sql spark-dataframe apache-spark-mllib

我在spark中计算了一个相关矩阵,我希望结合它们的列名提取单个相关性。

相关矩阵

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 个答案:

答案 0 :(得分:2)

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,correlation)组成的三元组列表

最后,我们将其转换为具有所需列名称的DF。

请注意filterNot是可选的,只保留矩阵的一半(不包括对角线),因为它是对称的,因此多余,如果你想要完整列表只是删除它。