在Spark Shell中将CSV读入Matrix

时间:2017-07-19 10:11:10

标签: scala apache-spark apache-spark-mllib

我有一个~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)

然后我可以将m1m1.multiply()相乘,这很好。但是,当我尝试使用大文件时,我会遇到内存错误异常和其他问题,即使文件只有1GB。

这是在spark中为矩阵对象创建矩阵对象的最佳方法吗?整个读入数组,然后转换为DenseMatrix似乎是不必要的,并导致内存问题。

scala / spark非常新,所以感谢任何帮助。

注意:我知道这可以在python,R,matlab等内存中完成,但这更像是一个概念证明,因此它可以用于更大的文件。

1 个答案:

答案 0 :(得分:0)

尝试使用org.apache.spark.mllib.linalg.distributed中的 distrubuted 矩阵实现,这将使用RDD API,您将从spark提供的并行性中受益。

有关详细信息,请参阅official documentation

我还建议您阅读名为使用Spark的可扩展矩阵乘法this blog