我在以前用sc.textFile加载的矩阵上执行了主成分分析。输出是org.apache.spark.mllib.linalg.Matrix然后我将它转换为RDD [Vector [Double]]。
使用:
import java.io.PrintWriter
我做了:
val pw = new PrintWriter("Matrix.csv")
rows3.collect().foreach(line => pw.println(line))
pw.flush
输出csv很有希望。唯一的问题是每一行都是DenseVector(一些值)。如何将每一行拆分为相应的系数?
非常感谢
答案 0 :(得分:1)
您可以使用computePrincipalComponents
和breeze.linalg.csvwrite
:
import java.io.File
import breeze.linalg.{DenseMatrix => BDM, csvwrite}
val mat: RowMatrix = ...
val pca = mat.computePrincipalComponents(...)
csvwrite(
new File("Matrix.csv"),
new BDM[Double](mat.numRows, mat.numCols, mat.toArray))
答案 1 :(得分:0)
将每个向量转换为字符串(您可以在驱动程序或执行程序上执行此操作)
val pw = new PrintWriter("Matrix.csv")
rows3.map(_.mkString(",")).collect().foreach(line => pw.println(line))
pw.flush
编辑: 如果你的数据太大而无法放入驱动程序的内存中,你可以尝试类似的东西:
val rdd = rows3.map(_.mkString(",")).zipWithIndex.cache
val total = rdd.count
val step = 10000 //rows in each chunk
val range = 0 to total by step
val limits = ranges.zip(range.drop(1))
limits.foreach { case(start, end) =>
rdd.filter(x => x._2 >= start && x._2 < end)
.map(_._1)
.collect
.foreach(pw.println(_))
}
我无法尝试这一点,但这是一般的想法