2015-10-01 58 views
6

我測試了寫慢得多:星火partitionBy比沒有它

df.write.partitionBy("id", "name") 
    .mode(SaveMode.Append) 
    .parquet(filePath) 

但是如果我離開了劃分:(!)

df.write 
    .mode(SaveMode.Append) 
    .parquet(filePath) 

它執行快100倍。

分區時,相同數據量的數據寫入時間延長了100倍是正常嗎?

有分別爲10和3000獨特idname列值。 DataFrame有10個額外的整數列。

+0

它會導致洗牌嗎? – Gillespie

+0

涉及多少數據?在強制對它進行分區之前,它可能都適合於一個分區。 –

+0

@Gillespie我怎麼知道? – BAR

回答

1

第一個代碼片段將爲每個分區寫入一個parquet文件到文件系統(本地或HDFS)。這意味着如果您有10個不同的ID和3000個不同的名稱,則此代碼將創建30000個文件。我懷疑創建文件,編寫實體元數據等開銷很大(除了洗牌)。

Spark不是最好的數據庫引擎,如果你的數據集適合內存我建議使用關係數據庫。與其合作會更快,更容易。

+0

你是否認爲拼花地板不是最好的數據庫存儲?我正在設置jdbc來postgres來測試性能。我不認爲這些數據必須適合內存。不是那個火花的背後點嗎? – BAR

+0

實木複合地板文件格式其實相當不錯,但是如果Spark是這個工作的正確工具,則很大程度上取決於您的使用情況。 Spark針對大量數據的並行處理進行了優化。如果你有幾個甚至100GB的數據,像postgresql這樣的數據庫可能會是一個更好的選擇。雖然不知道你的用例,但很難給出任何建議。 – kostya

+0

有些人正在使用Spark來處理PB數據。我相信Spark能夠並行處理來自任何支持源的數據,包括JDBC。我有大約250GB的處理能力,可以分區到大小約1GB的文件並行運行。 – BAR