锐客网

实用详解spark的读取方法textFile和wholeTextFiles

谈清楚区别,说明道理,从案例start:
1 数据准备
用hdfs存放数据,且结合的hue服务上传准备的数据,我的hue上数据截图:

实用详解spark的读取方法textFile和wholeTextFiles
文章图片
三个文件下的数据分别为:
l
实用详解spark的读取方法textFile和wholeTextFiles
文章图片
AND

实用详解spark的读取方法textFile和wholeTextFiles
文章图片
AND

实用详解spark的读取方法textFile和wholeTextFiles
文章图片

以上是3个文件的数据,每一行用英文下的空格隔开;
2 测试 sc.textFile()和sc.wholeTextFiles()的效果
sc.testFile() 如图:

实用详解spark的读取方法textFile和wholeTextFiles
文章图片

sc.wholetextFiles() 如下图:

实用详解spark的读取方法textFile和wholeTextFiles
文章图片
注意 一定要仔细观察红色方框圈起来的差异,经过以上两次截图中实验的对比,我们得出重要的结论:
sc.textFiles(path) 能将path 里的所有文件内容读出,以文件中的每一行作为一条记录的方式,
文件的每一行 相当于 List中以 “,”号 隔开的一个元素,因此可以在每个partition中用for i in data的形式遍历处理Array里的数据;
而使用 sc.wholeTextFiles()时:
返回的是[(K1, V1), (K2, V2)...]的形式,其中K是文件路径,V是文件内容,这里我们要注意的重点是:
官方一句话:''Each file is read as a single record'' 这句话,每个文件作为一个记录!这说明这里的 V 将不再是 list 的方式将文件每行拆成一个 list的元素,
而是将整个文本的内容以字符串的形式读进来,也就是说val = '...line1...\n...line2...\n'
这时需要你自己去拆分每行!而如果你还是用for i in val的形式来便利 val那么i得到的将是每个字符.

3 两种读取文件下与partition的数量关系
理论最后总结,先上2张实用数据测试截图:

实用详解spark的读取方法textFile和wholeTextFiles
文章图片
PK

实用详解spark的读取方法textFile和wholeTextFiles
文章图片
从上面的操作来看,总结如下:
用textFile时,它的partition的数量是与文件夹下的文件数量(实例中用3个xxx.log文件)相关,一个文件就是一个partition(既然3个文件就是:partition=3,特别提醒:这里的测试数据是几十byte,较小,如果每个文件较大,要根据相应切分原则切分)。
wholeTextFiles的partition数量是根据用户指定或者文件大小来(文件内的数据量少 有hdfs源码默认确定的)确定,与hdfs目录下的文件数量无关! 所以说:wholeTextFile通常用于读取许多小文件的需求。

【实用详解spark的读取方法textFile和wholeTextFiles】适用为主,学习借鉴~



      大数据C位