将主成分分析的输出写入文本文件

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(_))
}

我不能尝试这个,但这是一般的想法

您可以使用 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))