Spark:sc.textFiles() 與 sc.wholeTextFiles() 的區別


由於業務需要,需要將大量文件按照目錄分類的方式存儲在HDFS上,這時從HDFS上讀取文件就需要使用    sparkcontext.wholeTextFiles()

眾所周知,sc.textFiles(path) 能將path 里的所有文件內容讀出,以文件中的每一行作為一條記錄的方式:

>>> textFile = sc.textFile(path)
>>> textFile.collect()
[u'Hello world!']
文件的每一行 相當於 列表 的一個元素,因此可以在每個partition中用for i in data的形式遍歷處理數據。

而使用 sc.wholeTextFiles()時,
Read a directory of text files from HDFS, a local file system
(available on all nodes), or any Hadoop-supported file system
URI. Each file is read as a single record and returned in a
key-value pair, where the key is the path of each file, the
value is the content of each file.
...
>>> textFiles = sc.wholeTextFiles(dirPath)
>>> sorted(textFiles.collect())
[(u'.../1.txt', u'1'), (u'.../2.txt', u'2')]
"""

如上面所示,返回的是[(key, val), (key, val)...]的形式,其中key是文件路徑,val是文件內容,這里我們要注意的重點是:
'''Each file is read as a single record''' 這句話,
每個文件作為一個記錄!這說明這里的 val 將不再是 list 的方式為你將文件每行拆成一個 list的元素,
而是將整個文本的內容以字符串的形式讀進來,也就是說val = '...line1...\n...line2...\n'
這時需要你自己去拆分每行!而如果你還是用for i in val的形式來便利 val那么i得到的將是每個字符

------------以下是親自實驗的截圖---
dataRdd = sc.wholeTextFiles('hdfs://192.168.7.217:9000/clean/TD_FIRSTPAGE/part-r-*')
from cp_analysis.clean.DataClean import printData, printDataPartition
dataRdd.foreach(printData)
dataRdd.foreachPartition(printDataPartition)

def printData(x):
print x[0]
for line in x[1].split('\n'):
print line


def printDataPartition(data):
for x in data:
print x[0]
print '-----------------------------------------'
print x[1]

 下面是使用 for ele in X[1]:

        print ele

輸出的截圖:

 
        



 


免責聲明!

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



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