2017-07-19 61 views
0

我有一個〜1GB的csv文件(但我可以對其他數據類型打開,例如鑲木地板),我想要讀取Spark的5m行和23列,以便我可以將它們相乘以創建一個評分矩陣。在Spark Shell中將CSV讀取到Matrix中

在文件的較小版本我目前使用的這個過程:

// csv -> array -> Dense Matrix 

import org.apache.spark.mllib.linalg.{Matrix, Matrices, Dense Matrix} 
val test = scala.io.Source.fromFile("/hdfs/landing/test/scoreTest.csv").getLines.toArray.flatmap(._split(",")).map(_.toDouble) 
val m1: DenseMatrix = new DenseMatrix(1000,23,test) 

然後,我可以乘m1m1.multiply()這是所有罰款。但是,當我嘗試使用大文件時遇到內存錯誤異常和其他問題時,即使該文件只有1GB。

這是最好的方式來創建一個矩陣對象的火花準備乘法?整個讀入陣列,然後轉換爲DenseMatrix似乎是不必要的,並導致內存問題。

scala/spark非常新,所以任何幫助表示讚賞。

注意:我知道這可以在python,R,matlab等內存中完成,但這更多的是一個概念證明,以便它可以用於更大的文件。

回答

0

嘗試使用distrubuted矩陣實施org.apache.spark.mllib.linalg.distributed,這裏使用了RDD API,你會要由火花塞提供的並行性中獲益。

欲瞭解更多信息請參閱official documentation

我也建議你使用星火

閱讀 this blog有權 可擴展的矩陣乘法