Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将主成分分析的输出写入文本文件_Scala_Apache Spark_Apache Spark Mllib - Fatal编程技术网

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

Scala 将主成分分析的输出写入文本文件,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我已经对以前加载了sc.textFile的矩阵进行了主成分分析。输出为org.apache.spark.mllib.linalg.Matrix I,然后将其转换为RDD[Vector[Double]] 与: 我做到了: val pw = new PrintWriter("Matrix.csv") rows3.collect().foreach(line => pw.println(line)) pw.flush 输出是有希望的。唯一的问题是每条线都是一个Dense

我已经对以前加载了sc.textFile的矩阵进行了主成分分析。输出为org.apache.spark.mllib.linalg.Matrix I,然后将其转换为RDD[Vector[Double]]

与:

我做到了:

    val pw = new PrintWriter("Matrix.csv")
    rows3.collect().foreach(line => pw.println(line))
    pw.flush
输出是有希望的。唯一的问题是每条线都是一个DenseVector(某些值)。如何将每一行拆分为相应的系数


非常感谢

将每个向量转换为字符串(您可以在驱动程序或执行程序上执行)

编辑: 如果您的数据太大,无法存储在驱动程序的内存中,您可以尝试以下方法:

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(_))
}
val rdd=rows3.map(u.mkString(“,”).zipWithIndex.cache
val total=rdd.count
val step=10000//每个块中的行
val范围=0到逐步总计
val limits=ranges.zip(range.drop(1))
limits.foreach{case(开始,结束)=>
rdd.filter(x=>x.\u 2>=start&x.\u 2

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

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

这不是应该怎么做的。您应该忘记,您正在尝试使用分布式系统的边界进行编写。如果这不增加JVM的开销,您应该会遇到一些并发性问题!我知道它可以工作,但是Spark作为一个分布式系统的全部目的是它的可伸缩性。另外,考虑到输出的可变数据的非原子转换,您可能会遇到一些并发问题。没有并发问题
collect()。如果您知道输出数据很小(但中间数据很大),那么这是使用Spark的一种非常合理的方法。
computePrincipalComponents
返回
org.apache.Spark.mllib.linalg.Matrix
,并且它已经是一个本地数据结构。一开始真的没有理由将其转换为RDD。看一看!除了当我检查outputfile时,没有显示所有的值;它基本上与控制台输出相同,例如第一行:“value1 value2…(总共523个)”
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(_))
}
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))