Scala - 如何将csv表读入两个不确定大小的暗淡数组/矩阵

时间:2018-03-23 20:31:10

标签: scala csv apache-spark matrix multidimensional-array

我想从一个巨大的csv文件中读取,通过","分割值将每一行分配给一个数组。最后,我的目标是拥有一个包含值的数组(行)数组。 到目前为止,我的代码是这样的:

val file = "/home/tolga/Desktop/mics18-2/big-data/homework2/covtype.csv/data-10.csv"
for(line <- Source.fromFile(file).getLines){
  val seriesArray : Array = line.split(",").map(_.toInt).distinct /*error on this line*/
  println(line)
}

2 个答案:

答案 0 :(得分:1)

对于我的测试文件,我必须做一些调整:

for(line <- Source.fromFile(file).getLines){
     val seriesArray : Array[Int] = line.split (",").filter (_.trim.size > 0).map (_.toInt).distinct
     println(line) }
  • 不是Array,但是Array [Int]作为错误消息显示
  • 我必须修剪弦乐,也许是行尾的神器
  • 检查尺寸&gt; 0,避免&#34;&#34; .toInt

最后两个可能与您的文件无关。

不,那不会产生2dim阵列。它只在一行上运行,将它分配给serialArray,它是一个单调的数组,并覆盖每一行的值。

保留所有行

scala> val seriesArray : Array[Array[Int]] = (
     |   for (line <- Source.fromFile(file).getLines) yield 
     |     line.split (",").filter (_.trim.size > 0).map (_.toInt).distinct).toArray

显示,对于我的testdata:

seriesArray: Array[Array[Int]] = Array(Array(), Array(1, 49, 999), Array(), Array(1, 49, 1000), Array(), Array(1, 50, 999), Array(), Array(1, 50, 1000), Array(), Array(1, 51, 999), Array(), Array(1, 51, 1000), Array(), Array(2, 49, 999), Array(), Array(2, 49, 1000), Array(), Array(2, 50, 999), Array(), Array(2, 50, 1000), ...

对于打印,您需要有点耐心,因为print语句返回Unit而不是数据。

答案 1 :(得分:0)

对于基于Spark的解决方案,最终结果将是<input id="numbers" value="3,5,7,9"> <div>Smallest: <span id="smallest"></span></div> <div>Biggest: <span id="biggest"></span></div> <div>Total: <span id="total"></span></div>而不是严格意义上的“二维数组”,因为RDD是分区的,分布式的,不可变的“数组”的抽象。

将CSV文件加载到RDD很简单,但是细节中有魔鬼。给出一个简单的文件,例如这个RDD[Array[Int]]文件:

data.csv

以下方法可行:

1,1,3,2
2,22,3,18
3,3,12,25

但是,如果必须以某种方式“清除”输入(例如删除标题行,修剪值,过滤掉非整数等),则必须使用RDD的方法(如val rdd = sc.textFile("data.csv").map(_.split(",").map(_.toInt)) filter。如果您遇到此类清理的特定问题,请搜索特定问题或使用您的代码发布新问题,您的数据就是您看到的错误。