2014-07-08 93 views
0

我想用spark來總結一個文件的所有行的長度。 這些行格式如下:用Spark讀取整個文件

A1004AX2J2HXGL\tB0007RT9LC\tMay 30, 2005\t3\n\t4\t5.0\tLes carottes sont cuites 

爲了達到我的目標,我試圖在documentation給出此代碼:

JavaRDD<String> txtFile = sc.textFile(filePath); 
JavaRDD<Integer> linesLength = txtFile.map(s -> s.length());  
long totalLength = linesLength.reduce((a, b) -> a+b); 

但是,這是行不通的。例如,對於一個5.8GB的文本文件,它返回1602633268時它應該返回5897600784. 我想這是由於一些行可能包含奇怪的字符, 停止行的閱讀。

隨着古老的古老Java,這個問題可以用BufferedReader來解決,就像在this case中一樣。但是,在文檔中我沒有發現Spark中類似的東西。

我該怎麼辦?

+0

你怎麼知道1602633268是錯的? – aaronman

+0

我沒有使用Spark進行檢查。 – fxm

+0

答案是什麼?也是壓縮文件? – aaronman

回答

0

我把它全加錯了,它只是一個整數溢出。我把它通過改變整數龍工作:

JavaRDD<String> txtFile = sc.textFile(path); 
JavaRDD<Long> linesLength = txtFile.map(s -> Long.valueOf(s.length())); 
Long totalLength = linesLength.reduce((a, b) -> a +b); 
2

我知道你已經找到你的問題的至少一部分,並且回答了這個問題,但我想指出的另一個問題:你指望字符在此Spark代碼中,但聽起來像您正在嘗試查找字節中的文件大小。這些都不一定是一回事。

+0

我知道這不是確切的,但如果該文件是未壓縮的,並且你正在計算字節數,爲什麼即使運行一個火花作業,該文件是5.8千兆「字節」 – aaronman

+0

我想這取決於什麼寫出文件 - 即是否它被寫爲ASCII或UTF。如果它被寫爲ASCII,則數字應該相同。如果它被寫爲UTF,它將是1x,2x或4x加上BOM的長度。嘿肖恩,是否可以配置Spark使用哪個UTF? http://stackoverflow.com/questions/24651969/control-configure-set-apache-spark-utf-encoding-for-writting-as-saveastextfile – samthebest

+0

它代表下面的Hadoop的TextInputFormat。我認爲它總是使用UTF8,或者至少在一年前我看過的時候是這樣。我想你可以設法用自定義編碼來閱讀別的東西。 –