我有一个~1GB的csv文件(但对其他数据类型,例如镶木地板是开放的),有5m行和23列,我想读入Spark,以便我可以将它乘以创建一个评分矩阵。
在我目前使用此过程的文件的较小版本上:
// 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)
然后我可以将m1
与m1.multiply()
相乘,这很好。但是,当我尝试使用大文件时,我会遇到内存错误异常和其他问题,即使文件只有1GB。
这是在spark中为矩阵对象创建矩阵对象的最佳方法吗?整个读入数组,然后转换为DenseMatrix似乎是不必要的,并导致内存问题。
scala / spark非常新,所以感谢任何帮助。
注意:我知道这可以在python,R,matlab等内存中完成,但这更像是一个概念证明,因此它可以用于更大的文件。
答案 0 :(得分:0)
尝试使用org.apache.spark.mllib.linalg.distributed
中的 distrubuted 矩阵实现,这将使用RDD
API,您将从spark提供的并行性中受益。
有关详细信息,请参阅official documentation。
我还建议您阅读名为使用Spark的可扩展矩阵乘法的this blog