(图片来源于网络,侵删)
【1】textFile() 与 sc.wholeTextFiles的区别
1)当指定的路径是目录且该目录下全部都是文件时,textFile() 和 wholeTextFiles() 都正常读取
2)当指定的路径是文件时,textFile() 和 wholeTextFiles() 都正常读取
3)当指定的路径是目录且该目录下既有文件也有目录时,textFile() 会报错, wholeTextFiles() 正常读取该目录下的所有文件
1)textFile读取文件的每一行作为 列表List的 一条记录,所以返回一个RDD[String]
2) wholeTextFiles() 读取是按照文件进行读取,返回一个RDD[(key, val)]
,其中key是该文件的文件路径,value是这个文件的所有数据,所以我们对value进行数据解析(例如通过\r\n将数据进行按行切分),才能对文件数据进行操作
【2】textFile() 读取数据分区数量规则
如果不指定默认分区数量,则默认分区数量为2,则会根据 所有
文件字节大小totalSize 除以 分区数量partitons的值 goalSize,然后比较 goalSize 和 hdfs指定分块大小(这里是32M)作比较,以较小的最为goalSize作为切分大小,对每个
文件进行切分,若文件大小大于goalSize,则会生成 totalSize / goalSize + 1
个分区