我们需要并行读取许多文本文件。这些是使用Spark流媒体工作创建的,但这是一个很长的故事。定期需要进行批量计算,因此我们创建一个以逗号分隔的文件列表,以传递给sparkContext.textFile(fileList)。列表可以变得非常大(可能是10000)并且全部都在hdfs上。
问题是:阅读它们的最佳方式是什么?
我们想到的可能性:
答案 0 :(得分:1)
确保所有文件都在同一目录中,并使用sparkContext.wholeTextFiles(directoryPath)方法将目录中的所有文件读取为JavaPairRDD,其中文件名为key,文件内容为value。
干杯!!
答案 1 :(得分:0)
实际上有两种解决方案可能适合您的需求。在这两种方法中,变量dir
必须指向群集上所有节点可用的目录:
wholeTextFiles(dir)
创建一个带有key/value
结构的 PairRDD 对象,其中key
是文件的完整路径,value
是包含 all 该文件内容的字符串。它为每个文件创建一个条目,并根据可用的执行程序核心数量进行分区。
PairRDD (key,value):
hdfs://TextFile1.txt,this is the content of the file textfile4
hdfs://TextFile2.txt,this is the content of the file textfile4
hdfs://TextFile3.txt,this is the content of the file textfile4
hdfs://TextFile4.txt,this is the content of the file textfile4
相反, textFile(dir)
保留原始结构并为每个文件创建一个分区,例如,这对于因依赖性而无法拆分到不同分区的文件非常有用。这意味着拥有1000个文件将导致1000个分区。
哪种方法最好取决于您的应用程序的需求。如果数据完全独立且文件内容不依赖于自身,wholeTextFiles
可能是更好的方法,而textFile
可能适合您,如果维护文件结构很重要。