[英]How to write multiple parquet files in parallel in pyspark?
我想將數據幀分為兩個數據幀,並將它們寫入兩個單獨的鑲木地板文件中,如下所示
df = attachment_df.flatMap(process_attachment).toDF()
large_df = df.filter(df.is_large_file == True)
small_df = df.filter(df.is_large_file == False)
(large_df.write
.mode("overwrite")
.parquet('large_dummy'))
(small_df.write
.mode("overwrite")
.parquet('small_dummy'))
但是,上面的代碼將按順序編寫,並且看起來process_attachment函數為每個附件調用了兩次。 我真的想避免重復計算,因為處理附件非常昂貴。
有沒有辦法避免重復處理附件並並行寫入? 我不想使用is_large_file列的分區寫入單個實木復合地板文件。
謝謝,
當spark寫入時,它為每個數據幀並行寫入(基於分區的數量)。 因此,您基本上是在串行執行兩個並行任務(即,效果不大)。 主要問題是,當前您要重新計算df兩次。
這樣做的原因是,DAG是針對每個動作(寫為一個動作)分別計算的。
如果您有足夠的內存,則可以通過在第一次寫入之前執行df.cache()並在第二次寫入之后執行df.unpersist來簡單地改善此性能。 這將在可能時將df的計算保留在內存中(即,有足夠的內存)。
如果您沒有足夠的內存,並且process_attachment確實很長,則可以嘗試將persist和MEMORY_AND_DISK選項一起使用,如果太大,該選項會將計算結果溢出到磁盤上(即,您將從磁盤重新加載而不是重新計算)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.