在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