将主成分分析的输出写入文本文件
Writing output of the Principal Components Analysis to text file
我对之前用 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(一些值)。如何将每一行拆分为相应的系数?
非常感谢
将每个向量转换为字符串(您可以在驱动程序或执行程序上执行此操作)
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(_))
}
我不能尝试这个,但这是一般的想法
您可以使用 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))
我对之前用 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(一些值)。如何将每一行拆分为相应的系数?
非常感谢
将每个向量转换为字符串(您可以在驱动程序或执行程序上执行此操作)
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(_))
}
我不能尝试这个,但这是一般的想法
您可以使用 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))