将Principal Components Analysis的输出写入文本文件

时间:2015-07-06 15:11:42

标签: scala apache-spark apache-spark-mllib

我在以前用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(一些值)。如何将每一行拆分为相应的系数?

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以使用computePrincipalComponentsbreeze.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(_))
}

我无法尝试这一点,但这是一般的想法