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

How to convert a mllib matrix to a spark dataframe?

我想在 zeppelin notebook 中漂亮地打印相关结果:

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

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

但是,查看 Matrix api 我没有看到任何方法可以做到这一点。

还有其他直接的方法可以实现吗?

编辑:

数据框有 50 列。仅转换为字符串无济于事,因为输出会被截断。

如果您只想打印矩阵,使用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 |
+----+----+----+