如何将mllib矩阵转换为spark数据帧?

时间:2018-02-25 18:50:16

标签: scala apache-spark matrix apache-spark-mllib apache-zeppelin

我想在zeppelin笔记本中打印相关结果:

val Row(coeff: Matrix) = Correlation.corr(data, "features").head

实现此目的的一种方法是将结果转换为DataFrame,并将每个值都放在一个单独的列中,然后调用z.show()

然而,调查Matrix api我没有看到任何方法来做到这一点。

还有其他直接的方法来实现这个目标吗?

编辑:

数据框有50列。只是转换为字符串无助于输出被截断。

1 个答案:

答案 0 :(得分:2)

如果您只想打印矩阵,使用toString方法应该是最简单快捷的方法。您可以通过输入要打印的最大行数以及最大行宽来更改输出。您可以通过拆分新行和","来更改格式。例如:

val matrix = Matrices.dense(2,3, Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0))
matrix.toString
  .split("\n")
  .map(_.trim.split(" ").filter(_ != "").mkString("[", ",", "]"))
  .mkString("\n")

将提供以下内容:

[1.0,3.0,5.0]
[2.0,4.0,6.0]

但是,如果您想将矩阵转换为DataFrame,最简单的方法是首先创建RDD,然后使用toDF()

val matrixRows = matrix.rowIter.toSeq.map(_.toArray)
val df = spark.sparkContext.parallelize(matrixRows).toDF("Row")

然后将每个值放在一个单独的列中,您可以执行以下操作

val numOfCols = matrixRows.head.length
val df2 = (0 until numOfCols).foldLeft(df)((df, num) => 
    df.withColumn("Col" + num, $"Row".getItem(num)))
  .drop("Row")
df2.show(false)

使用示例数据的结果:

+----+----+----+
|Col0|Col1|Col2|
+----+----+----+
|1.0 |3.0 |5.0 |
|2.0 |4.0 |6.0 |
+----+----+----+