布萊恩上麵的回答可能是最簡單的。這裏有一些其他的選擇,以防線。分離器並不來電:
選擇:自定義CSV讀者
修改CSV讀者和上傳圖書館。下麵是步驟:
選擇:修複原始文件…
創建一個程序讀取文件的字節流,維修的字節,並寫出一個新的,修複文件。它簡單的如果你沒有並行,但是你可以並行化,如果你希望通過將文件分為多個1 gb的數據塊,然後提前尋求相關部門處理這些並行。
目前所知的唯一選擇是解決行分隔符之前標準處理。
本著這一精神,我能想到的一個選擇是使用SparkContext.wholeTextFiles (. .)閱讀在一個抽樣,將海關數據的行分隔符,然後有一些附加的選擇:
這樣做的主要缺點是每個文件的大小。調用wholeTextFiles (. .)將每個文件加載單個分區這意味著我們可以很容易地使用所有可用的內存。
第二個選項我能想到的就是上麵執行相同的操作,但從驅動程序與標準文件IO(如果可能的話)。Scala / Python庫文件操作很簡單讓你讀一塊數據,清理和寫一個新文件。這是一個非常醜陋的實際的解決方案,而不是如果你工作在大多數數據存儲像S3, HDFS等等。
我將嚐試運行這個問題由其他教師和/或工程師是否有一些未知的/無證的解決方案。
從引用的公關,我假設我們討論處理文件,使用以外的東西\ n劃入lines-e.g。,r \,或\ r \ n。從CSV文件被認為是文本文件,因為Java使用特定於平台的概念行分隔符(Beplay体育安卓版本System.getProperty (“line.separator”)),它可能有可能改變這一係統屬性。然而,我不是100%肯定會工作,沒有(一個)挖掘的源CSV讀者,或(b)在嚐試改變屬性(這需要傳播到執行人)。
我肯定會遠離wholeTextFiles ()的原因,雅各布·帕爾(@SireInsectus)提到。
所以我追下來的所有調用最新版本的源代碼(@Brian克拉珀的幫助),它歸結為如何org.apache.hadoop.util。LineReader實現——簡而言之,它是硬編碼使用CR和低頻如果沒有指定一個特定的記錄分隔符。