我在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
我试过写一个地图功能,但它没有像我预期的那样工作。
你能提出任何解决方案吗?
答案 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是可选的,只保留矩阵的一半(不包括对角线),因为它是对称的,因此多余,如果你想要完整列表只是删除它。