spark中數據在python中的使用

最近遇到了要把spark中的數據拿到python中進行再處理的過程。
常規操作是df.write.format(“csv”).mode(“overwrite”).save("./test.csv")或者是rdd.saveAsTextFile("./test.text")

本來以爲常規的保存之後,就能夠用了,但是遇到了幾個坑,記錄一下:

合併文件

在spark中無論是RDD還是dataframe,如果是直接保存的話,會按照分區數量保存成多個文件,如果只想獲取一個文件拿到python裏面使用,可以用

rdd.coalesce(1).saveAsTextFile("./test.text") 
df.coalesce(1).write.format("csv").mode("overwrite").save("./test.csv")

亂碼問題

本來以爲保存成一個文件之後,在python就能夠順利使用了,但無論我是保存成textFile還是csv格式,發現python裏面會亂碼,出現一堆\x005A\xed\x0411A^\t)\x0e\x86\x08\x12\x87\x1e\x0e\x1這樣的結果。我一度以爲是編碼的問題,然後各種使用encoding都不行。而且我的數據裏面並沒有中文,所以邏輯上不應該存在這樣的問題。
這中間修改pd.read_csv的各種參數遇到了各種問題。這裏小小羅列一下,也許你們遇到這個問題的時候,也是面臨了和我一樣的問題。

1、pandas.errors.parsererror: error tokenizing data. c error: buffer overflow caught - possible malformed input file
2、spark save 'utf8' codec can't decode byte 0xa9 in position 7: invalid start byte
3、pandas.errors.ParserError: Error tokenizing data. C error: Expected 3 fields in line 5, saw 5
4、Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
5、unable to find expected entry 'universe multiverse/source/sources' in release file (wrong sources.list entry or malformed file
......

在瀕臨放棄的時候,我發現我本地使用小數據集做測試的時候保存文件,文件後綴都直接是“.csv”(保存成csv格式的時候)或者是沒有後綴(保存成textfile格式的時候)。但是我在服務器上保存的文件都有.snappy的後綴。後面發現這是因爲數量大的時候,spark在保存文件時會對文件進行壓縮。所以如果我想實現用spark保存文件之後在python中進行使用,就不能讓spark壓縮我的文件。這個時候就需要將option選項中的壓縮方式改爲“不壓縮”。

df.write.format("csv").mode("overwrite").option("compression", "uncompressed").save("./test.csv")

參考了一下壓縮方式以及其他option選項

saveTextFile的壓縮問題

本來想繼續用saveTextFile不進行壓縮實現將rdd直接保存下來使用的,但是rdd直接保存存在兩個問題:
1、沒辦法“overwrite”
2、網上攻略寫在提交spark的時候用 --conf spark.hadoop.mapred.output.compress=false,這個對我來說貌似無效。
綜上,我放棄了用saveTextFile,直接使用了rdd.toDF(),然後保存成csv,並在保存的時候添加.option(“header”, “false”),配合在python中使用open()的方式來做了。

python只能讀本地文件

用spark保存了的文件,只能儲存在服務器上。但是用python進行操作,又不好直接從hdfs上讀取文件。而且,我的代碼是需要以後設置定時任務進行調度的,所以有沒有辦法每次手動的把文件從hdfs上download到本地。所以,這裏在python中用

os.system("hadoop fs -get hdfs_path local_path")

保證了整個流程不用我自己每次手動干預了。

到此,終於結束了將數據從spark遷移到python中繼續進行處理的工作。
問題都不大,但是廢了很多時間…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章