2016-12-18 51 views
-1

我有一個簡單的大小爲7 GB的文件,其中包含由| .I分隔的兩列的每行都從此文件創建了RDD,但當我在這個RDD上使用映射或過濾器轉換時,我得到太多的字節異常。Spark map/Filter throws java.io.IOException:換行符之前的字節太多:2147483648

下面是我的文件中的示例數據。

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) 
+1

如果您提供實際的代碼+您獲得的堆棧跟蹤將會很有幫助。 –

+0

請用上面的代碼編輯問題。 –

+0

代碼在哪裏? –

回答

0

問題是與我的斯卡拉代碼,而分隔線與管道分隔符,我已經改變了代碼,現在它工作。下面的代碼是 。

  val input = sparkContext.textFile("hdfsfilePath"); 

      input.filter(x=>x.split('|')(1).toInt > 15000).saveAsTextFile("hdfs://output file path") 

而不是「|」我需要使用'|'或「\\ |」在拆分方法。

0

我最近有這個問題。

對我來說,這不是一個內存問題或scala代碼問題。

原來是一個不完整/畸形的CSV,即CSV文件的最後一行被縮短了。

要解決此我手動刪除使用中的最後一行

sed -i '$d' /fileName 

但是,如果這對你一個共同的問題,它可能是更好的使用databricks火花CSV包: https://github.com/databricks/spark-csv

它包括:DROPMALFORMED:刪除具有比預期更少或更多標記的行或者與模式不匹配的標記。這在我的情況下很有用。