我想在zeppelin笔记本中打印相关结果:
val Row(coeff: Matrix) = Correlation.corr(data, "features").head
实现此目的的一种方法是将结果转换为DataFrame,并将每个值都放在一个单独的列中,然后调用z.show()
。
然而,调查Matrix api我没有看到任何方法来做到这一点。
还有其他直接的方法来实现这个目标吗?
编辑:
数据框有50列。只是转换为字符串无助于输出被截断。
答案 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 |
+----+----+----+