談清楚區別,說明白道理,從案例開始:
1 數據准備
用hdfs存放數據,且結合的hue上傳准備的數據,我的hue截圖:
每個文件下的數據:
以上是3個文件的數據,每一行用英文下的空格隔開;
2 測試 sc.textFile()和sc.wholeTextFiles()的效果
testFIle() 如圖:
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張實用數據測試截圖:
從上面的操作來看,總結如下:
用textFile時,它的partition的數量是與文件夾下的文件數量(實例中用3個xxx.log文件)相關,一個文件就是一個partition(既然3個文件就是:partition=3)。
wholeTextFiles的partition數量是根據用戶指定或者文件大小來(文件內的數據量少 有hdfs源碼默認確定的)確定,與hdfs目錄下的文件數量無關! 所以說:wholeTextFile通常用於讀取許多小文件的需求。
!!如有更好的意見,歡迎留言交換!!