Scala 如何在Spark中将RowMatrix更改为数组或将其导出为CSV?

Scala 如何在Spark中将RowMatrix更改为数组或将其导出为CSV?,scala,csv,apache-spark,Scala,Csv,Apache Spark,我在Scala中有以下代码: val mat: CoordinateMatrix = new CoordinateMatrix(data) val rowMatrix: RowMatrix = mat.toRowMatrix() val svd: SingularValueDecomposition[RowMatrix, Matrix] = rowMatrix.computeSVD(100, computeU = true) val U: RowMatrix = svd.U // The U

我在Scala中有以下代码:

val mat: CoordinateMatrix = new CoordinateMatrix(data)
val rowMatrix: RowMatrix = mat.toRowMatrix()

val svd: SingularValueDecomposition[RowMatrix, Matrix] = rowMatrix.computeSVD(100, computeU = true)

val U: RowMatrix = svd.U // The U factor is a RowMatrix.
val S: Vector = svd.s // The singular values are stored in a local dense vector.
val V: Matrix = svd.V // The V factor is a local dense matrix.

val uArray: Array[Double] = U.toArray // doesn't work, because there is not toArray function in RowMatrix type
val sArray: Array[Double] = S.toArray // works good
val vArray: Array[Double] = V.toArray // works good

如何将U更改为uArray或类似类型,并将其打印到CSV文件中?

这是一个基本操作,考虑到U是行矩阵,您必须执行以下操作:

val U = svd.U
rows()是一个RowMatrix方法,它允许您从RowMatrix逐行获取RDD

您只需要在行矩阵上应用行,并映射RDD[Vector]来创建一个数组,将该数组连接到一个字符串中,从而创建一个RDD[string]

val rdd = U.rows.map( x => x.toArray.mkString(","))
您现在要做的就是保存RDD:

rdd.saveAsTextFile(path)
它的工作原理是:

def exportRowMatrix(matrix:RDD[String], fileName: String) = {
  val pw = new PrintWriter(fileName)
  matrix.collect().foreach(line => pw.println(line))

  pw.flush
  pw.close
}

val rdd = U.rows.map( x => x.toArray.mkString(","))
exportRowMatrix(rdd, "U.csv")

不知道为什么,但是saveAsTexFile没有像我预期的那样工作。但是,使用tip and rows()函数,我最终导出了它。谢谢:)你期待什么?我想我会收到一个.txt、.csv或类似的文件,我可以在Excel中查看。但它正在创建一个名为file path中最后一个字符串的文件夹,然后抛出NullPointerException。我做了一个“快速修复”,我将在回答中发布它。是的,saveAsTextFile会写入分区,所以您无法获取txt文件或csv文件。我通常做的是将文件夹中的文件转换成csv文件,比如collect方法的唯一问题是,如果矩阵太大,它会给你一个Java堆错误,所以要小心@伊莱萨哇!我已经有一个Java堆错误,所以现在我知道为什么了。我在Spark设置中增加了内存,问题就消失了;)增加内存并不总是一个好的解决方案,但是如果它对你有效,那么它是好的