1. 程式人生 > >Spark:sc.textFiles() 與 sc.wholeTextFiles() 的區別

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

一行 nal each span 由於 clean 16px ret tex

由於業務需要,需要將大量文件按照目錄分類的方式存儲在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

輸出的截圖:

技術分享圖片





 

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