如何将 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 |
+----+----+----+
我想在 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 |
+----+----+----+