我想从一个巨大的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)
}
答案 0 :(得分:1)
对于我的测试文件,我必须做一些调整:
for(line <- Source.fromFile(file).getLines){
val seriesArray : Array[Int] = line.split (",").filter (_.trim.size > 0).map (_.toInt).distinct
println(line) }
最后两个可能与您的文件无关。
不,那不会产生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
。如果您遇到此类清理的特定问题,请搜索特定问题或使用您的代码发布新问题,您的数据就是您看到的错误。