2017-02-14 38 views
0

我用withColumn和窗口操作(使用Python/Spark)構建了許多新列。這導致了大量的血統,這減慢了操作。實際上,每隔幾步將DataFrame保存到磁盤上會有很大幫助。如何強制保留Spark DataFrame的內存?

但我怎麼能方便地在內存中緩存和力物化一個數據幀,這樣的血統被降低?

(我見過的建議有關count,但我得到的印象是隻適用於RDDS?)

+0

'兩個'RDD'和'DF' count'作品(搜索'count'這裏:http://spark.apache.org/docs/latest/sql-programming-guide.html) – Yaron

回答

3

首先,指望會爲數據框中工作了。覆蓋整個數據幀的任何操作都已足夠(計數遍歷所有記錄,因此將實現整個數據幀)。

其次,重要的是要注意,血統不會因緩存而減少。整個譜系將作爲代碼生成的一部分進行分析和優化。唯一的區別是許多步驟可能會被跳過,因爲已經從緩存中實現的數據將被使用(順便說一句,這並非總是如此,有些情況下優化器可能會根據其內部啓發式決定重新計算)。

有兩種方法可以在數據框上剪切譜系。

  1. 寫入磁盤並重新加載(將血統切入「閱讀」部分)。
  2. 使用點校驗(後臺也可以保存和加載)。

    點校驗的優點是您可以寫入本地磁盤而不是分佈式磁盤(應該花費更少的時間),但是,這是通過RDD完成的(即使直接檢查點數據幀的新接口實際上使用RDD檢查點在幕後),因此大於數據幀大小,這可能導致它在實踐中變慢。

+0

是否保證'count'不會優化並跳過一些計算?由於後面的'withColumn'不會改變'count'的結果?在什麼時候「緩存」具體化?因爲'cache'本身並沒有做任何事情,所以直到最終完整的血統已經存在時纔會緩存數據?! – Gerenuk

+0

我不是100%確定當你做一個接一個的緩存時,但總的來說它應該可以工作。到目前爲止,它總是爲我工作...你可以簡單地嘗試它,並檢查發生了什麼... –