在Spark中,我有一個RDD,其中包含數百萬到本地文件的路徑(我們有一個共享的文件系統,因此它們在本地顯示)。在Scala中,我將如何創建一個由每個文件中所有行組成的RDD?在Spark中讀取數百萬本地文件
我試圖做這樣的事情:
paths.flatMap(path => sc.textFile(path))
但沒有奏效。我也試過這樣的:
paths.flatMap(path =>
scala.io.Source.fromInputStream(new java.io.FileInputStream(path)).getLines
)
這工作時本地工作,但沒有在多臺機器上運行時。我結束了這個錯誤:
java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
任何指針將不勝感激
(大多數解決方案點至今涉及通過文件的列表sc.textFile全部一次,這是不可能的,因爲名單可能非常大,現在一個典型的用例會產生20M的路徑,這不適合單個Java String)。
@ zero323哦,我不知道,很高興知道,我認爲最大字符串長度是65535個字符,但是2^31-1大約是2個字符,假設每個路徑是20個字符,它應該是足夠的。 – GameOfThrows
謝謝:)我可以用'SparkContext.union(paths.map(...))'來替換'.reduce(_。union(_))'嗎?這真的會產生__huge差異_。 (如果你這樣做,請從維基答案中刪除最後一段) – zero323
@ zero323哇,我沒想到這會更快,但它確實有很大的不同,你介意簡單解釋一下爲什麼?這與數據混洗有關嗎? – GameOfThrows