2017-05-11 82 views
1

我曾經用Python進行編程。我的公司現在已經安裝了Jupyter的Hadoop集羣。到目前爲止,我從未使用過Spark/Pyspark。使用(spark,python,pyspark,jupyter)將多個項目保存到HDFS

我能夠從HDFS容易加載文件爲這樣:

text_file = sc.textFile("/user/myname/student_grades.txt") 

而且I'm能寫出這樣的輸出:

text_file.saveAsTextFile("/user/myname/student_grades2.txt") 

事情我正嘗試實現就是使用一個簡單的「for循環」逐個讀取文本文件,並將其內容寫入一個HDFS文件。所以,我想這一點:

list = ['text1.txt', 'text2.txt', 'text3.txt', 'text4.txt'] 

for i in list: 
    text_file = sc.textFile("/user/myname/" + i) 
    text_file.saveAsTextFile("/user/myname/all.txt") 

所以這個工程的列表中的第一個元素,但後來給了我此錯誤消息:

Py4JJavaError: An error occurred while calling o714.saveAsTextFile. 
: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory 
XXXXXXXX/user/myname/all.txt already exists 

爲了避免我「所迷離」混亂的-out IP地址與XXXXXXXX。


什麼是正確的方法來做到這一點? 我將有大量的數據集(如'text1','text2'...),並希望在將它們保存到HDFS之前對它們執行一個python函數。但我希望將結果全部放在「一個」輸出文件中。

非常感謝!
MG

編輯: 看來我的最終目標不是很清楚。我需要分別對每個文本文件應用一個函數,然後我想將輸出附加到現有的輸出目錄。事情是這樣的:

for i in list: 
    text_file = sc.textFile("/user/myname/" + i) 
    text_file = really_cool_python_function(text_file) 
    text_file.saveAsTextFile("/user/myname/all.txt") 

回答

0

可以讀取多個文件,並通過

textfile = sc.textFile(','.join(['/user/myname/'+f for f in list])) 
textfile.saveAsTextFile('/user/myname/all') 

救他們,你會得到輸出目錄中的所有零件文件。

+0

看來我的最終目標不是很清楚。我需要分別對每個文本文件應用一個函數,然後我想將輸出附加到現有的輸出目錄。請參閱編輯 – mgruber

+0

所有文本文件的相同功能? – Suresh

+0

對於所有文件都是一樣的功能,但是我之前無法加入文本文件,因爲每個文件需要單獨處理 – mgruber

1

我想發表評論,但不能這樣做,因爲我沒有足夠的聲望。

您必須將RDD轉換爲數據幀,然後以附加模式寫入。爲了RDD轉換成數據幀,請看看這個答案:
https://stackoverflow.com/a/39705464/3287419
或此鏈接http://spark.apache.org/docs/latest/sql-programming-guide.html
爲了節省追加模式數據框下面的鏈接可能是有用的:
http://spark.apache.org/docs/latest/sql-programming-guide.html#save-modes

幾乎同樣的問題在這裏也Spark: Saving RDD in an already existing path in HDFS。但提供的答案是scala。我希望類似的東西也可以在Python中完成。

還有另一種(但醜陋的)方法。將您的RDD轉換爲字符串。讓結果字符串爲resultString。使用子進程將該字符串附加到目標文件即

subprocess.call("echo "+resultString+" | hdfs dfs -appendToFile - <destination>", shell=True) 
0

如果文本文件都具有相同的架構,你可以使用Hive讀取整個文件夾作爲一個表,並直接寫入該輸出。