textFile
spark所有基于文件的输入方法,都支持目录读取、压缩文件、和通配符,
比如:
textFile("/my/directory")
textFile("/my/directory/*.txt")
textFile("/my/directory/*.gz")
texeFile(1,2)
该方法还采用可选的第二个参数来控制文件的分区数(但并不是最终的分区数就是这个设置的值),分区规则可以参考源码。
接下来我们捋一下它的流程。
首先按住crtl,鼠标左键点击进入textFile方法,
1.查看textFile方法的定义
第一个参数是传入的文件路径
第二个参数是最小的分区数量(并不代表是最终的分区数量)
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)
}
★插播一条广告
如果我们指定textFile的第二个参数后,minPartitions就是我们指定的参数
如果我们不指定的话,它会使用defaultMinPartitions。
我们进入defaultMinPartitions,看看它是怎么定义的
def defaultMinPartitions: Int = math.min(defaultParallelism, 2)
默认并行度和2取最小值,那么defaultParallelism是什么???接下来我们继续进入defaultParallelism
def defaultParallelism: Int = {
assertNotStopped()
taskScheduler.defaultParallelism
}
它调用了taskScheduler的默认并行度,我们继续深入
似乎进入了一个死胡同
def defaultParallelism(): Int
我们左键点击到defaultParallelism,然后按alt+shift+h(idea的快捷键)查看它的实现类里面具体方法
来到了这里
override def defaultParallelism(): Int = backend.defaultParallelism()
继续点defaultParallelism
仿佛又来到了一个死胡同