我在文本文件中有以下数据
AAAA 0000 0.548 1.008 15.994
AAAB 0001 0.654 4.543 12.994
AAAB 0001 0.126 2.222 14.954
(约300K行)
我将数据收集到一个数组中,如下所示
val logData = sc.textFile("data.txt",2).collect
现在我想将所有第3个字段和第5个字段相乘并将它们存储在另一个数组中,就像这样
0.548 * 15.994
0.654 * 12.994
等等
并将输出存储在一个单独的数组中。为此我使用了
val arr = logData.map(item => item(2).toFloat*item(4).toFloat)
无论我增加多少堆大小,它都会给出Out of Heap Space错误。
以上述方式编码是否合适,还是有其他有效的方式
答案 0 :(得分:0)
作为变种你可以做到:
val arr:Array[Float] = Source
.fromFile("data.txt")
.getLines()
.map(
line => {
val split = line.split(" ")
split(2).toFloat * split(4).toFloat
}
).toArray
我已经运行这个代码存档300k行没有任何内存调整
答案 1 :(得分:0)
在collect
时删除对textFile
的调用,因此它不是驱动程序的“作业”,而是执行程序来计算结果。
使用collect
,您可以将整个文件有效地加载到驱动程序的内存中,该内存可能只需1G。