Spark textFile vs wholeTextFiles
我了解
现在,从技术angular来看,两者之间有什么区别:
1 2 |
和
1 2 |
在这两种方法中,我都会生成8个分区。那么,为什么我应该首先使用
正如您提到的,
主要区别在于
使用
textFile generating partition for each file, whilewholeTextFiles generates an RDD of pair values
那是不准确的:
通常来说,
自Spark2.1.1起,以下是textFile的代码。
1 2 3 4 5 6 7 | def textFile( path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = withScope { assertNotStopped() hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], minPartitions).map(pair => pair._2.toString).setName(path) } |
内部使用hadoopFile以
之类的模式读取本地文件,HDFS文件和S3
其中,WholeTextFile的语法如下
1 2 3 | def wholeTextFiles( path: String, minPartitions: Int = defaultMinPartitions): RDD[(String, String)] = withScope |
如果我们观察到两种方法的语法相同,但是textfile可用于读取文件,其中,WholeTextFiles用于读取小文件的目录。我们怎么也可以使用更大的文件,但是性能可能会有所影响。
因此,当您要处理大文件时,textFile是更好的选择,而如果要处理小文件的目录,则WholeTextFile是更好的选择
textfile()读取文本文件并返回字符串的RDD。例如sc.textFile(" / mydata.txt ")将创建RDD,其中每行都是一个元素。
wholeTextFile()读取文本文件的目录并返回pairRDD。
例如,如果目录中的文件很少,那么WholeTextFile()方法将创建RDD对,其中文件名和路径为键,值是整个文件为字符串。
为清楚起见,请参见以下示例:-
1 2 | textFile = sc.textFile("ml-100k/u1.data") textFile.getNumPartitions() |
输出-2
即2个分区
1 2 | textFile = sc.wholeTextFiles("ml-100k/u1.data") textFile.getNumPartitions() |
输出-1
即只有一个分区。
所以总的来说,WholeTextFiles
从HDFS,本地文件系统(在所有节点上都可用)或任何Hadoop支持的文件系统URI中读取文本文件目录。每个文件都作为单个记录读取,并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。