舉例實用詳解sc.textFile()和wholeTextFiles()


談清楚區別,說明白道理,從案例開始:

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通常用於讀取許多小文件的需求

 

!!如有更好的意見,歡迎留言交換!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM