我有一个大小为7 GB的简单文件,其中包含两个以| .I分隔的列的每一行都从此文件创建了RDD但是当我在此RDD上使用map或filter转换时,我得到太多的字节异常。< / p>
下面是我文件中的示例数据。
116010100000000007 | 33448
116010100000000014 | 13520
116010100000000021 | 97132
116010100000000049 | 82891
116010100000000049 | 82890
116010100000000056 | 93014
116010100000000063 | 43434
116010100000000063 | 43434
这是代码
val input = sparkContext.textFile("hdfsfilePath");
input.filter(x=>x.split("|")(1).toInt > 15000).saveAsTextFile("hdfs://output file path")
以下是我得到的例外情况。
java.io.IOException: Too many bytes before newline: 2147483648
at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:249)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)
at org.apache.hadoop.mapreduce.lib.input.UncompressedSplitLineReader.readLine(UncompressedSplitLineReader.java:94)
at org.apache.hadoop.mapred.LineRecordReader.<init>(LineRecordReader.java:136)
答案 0 :(得分:0)
问题在于我的scala代码在使用管道分隔符拆分行时,我已经更改了代码,现在它正在运行。 下面是更改代码。
val input = sparkContext.textFile("hdfsfilePath");
input.filter(x=>x.split('|')(1).toInt > 15000).saveAsTextFile("hdfs://output file path")
而不是“|”我需要使用'|'或“\\ |”分裂方法。
答案 1 :(得分:0)
我最近遇到了这个问题。
对我来说,这不是内存问题或scala代码问题。
原来是一个不完整/格式错误的CSV,即CSV文件的最后一行被缩短了。
要解决此问题,我使用
手动删除了最后一行sed -i '$d' /fileName
但如果这对您来说是一个常见问题,那么使用databricks spark-csv包可能会更好: https://github.com/databricks/spark-csv
它包括:DROPMALFORMED:删除具有比预期更少或更多标记的行或与模式不匹配的标记。在我的情况下,这可能是有用的。