如何使用spark
并行读取目录中的文件我是sc.textfile但它按顺序读取每个文件
答案 0 :(得分:1)
您需要了解sc.textFile
和sc.WholeTextFiles
之间的区别
sc.textFile
读取给定目录中的所有文件,并创建一个分区作为文件号。如果有5个文件,那么它会创建5个分区。
sc.WholeTextFiles
读取给定目录中的所有文件并创建一个PairRDD,其中文件路径作为键,文件内容作为值。分区取决于执行程序的数量
答案 1 :(得分:0)
Spark可以并行读取目录中的文件。
为此你需要使用sc.wholeTextFiles
。
它将从HDFS读取文本文件目录,本地文件系统(在所有节点上都可用)或任何支持Hadoop的文件系统URI。每个文件都作为单个记录读取,并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。
例如,如果您有以下文件:
hdfs://a-hdfs-path/file1.txt
hdfs://a-hdfs-path/file2.txt
...
hdfs://a-hdfs-path/fileN.txt
执行val rdd = sparkContext.wholeTextFile(" hdfs:// a-hdfs-path"),
然后rdd包含
(a-hdfs-path/file1.txt, its content)
(a-hdfs-path/file2.txt, its content)
...
(a-hdfs-path/fileN.txt, its content)
注意 - 在某些文件系统上,.../path/*
可以更有效地读取目录中的所有文件,而不是.../path/
或.../path
。小文件是首选,大文件也是允许的,但可能会导致性能不佳。