簡體   English   中英

如何在pyspark中並行寫入多個實木復合地板文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM