Spark map / Filter抛出java.io.IOException:换行前的字节太多:2147483648

时间:2016-12-18 23:11:44

标签: scala hadoop apache-spark hdfs

我有一个大小为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)

2 个答案:

答案 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:删除具有比预期更少或更多标记的行或与模式不匹配的标记。在我的情况下,这可能是有用的。