2015-04-15 54 views

回答

0

由於Matrix是可串行化的,您可以使用普通的Scala編寫它。

你可以找到一個例子here

+0

感謝您的回答,卡洛斯。我想將Matrix保存在HDFS中。此外,如果可能的話,以人類「可讀」格式。就像是。 saveAsTextFile由RDD API提供 – florins

+0

您可以嘗試'data.saveAsTextFile(「hdfs:// ...」)'。我在[Spark examples web](https://spark.apache.org/examples.html)中看到了它。 –

0

謝謝您的建議。我拿出這個解決方案。感謝Ignacio的建議

val vtsd = sd.map(x => Vectors.dense(x.toArray)) 
val corrMat = Statistics.corr(vtsd) 
val arrayCor = corrMat.toArray.toList 
val colLen = columnHeader.size 
val toArr2 = sc.parallelize(arrayCor).zipWithIndex().map(
     x => { 
    if ((x._2 + 1) % colLen == 0) { 
     (x._2, arrayCor.slice(x._2.toInt + 1 - colLen, x._2.toInt + 1).mkString(";")) 
    } else { 
     (x._2, "") 
    } 
    }).filter(_._2.nonEmpty).sortBy(x => x._1, true, 1).map(x => x._2) 


toArr2.coalesce(1, true).saveAsTextFile("/home/user/spark/cor_" + System.currentTimeMillis()) 
4

這裏是一個簡單而有效的方法來保存矩陣到hdfs並指定分隔符。

(用於轉置,因爲.toArray在列的主要格式。)

val localMatrix: List[Array[Double]] = correlMatrix 
    .transpose // Transpose since .toArray is column major 
    .toArray 
    .grouped(correlMatrix.numCols) 
    .toList 

val lines: List[String] = localMatrix 
    .map(line => line.mkString(" ")) 

sc.parallelize(lines) 
    .repartition(1) 
    .saveAsTextFile("hdfs:///home/user/spark/correlMatrix.txt") 
0

迪倫霍格答案是偉大的,小幅提升,添加列索引。 (在我的使用情況下,一旦我創建了一個文件,並下載了它,這是沒有排序,由於並行處理等的性質)

裁判:https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch10s12.html

替代這一行,它將把一個序列號碼就行了(開始瓦特/ 0)使它更容易排序,當你去查看它

val lines: List[String] = localMatrix 
    .map(line => line.mkString(" ")) 
    .zipWithIndex.map { case(line, count) => s"$count $line" }