Spark != Pandas + 大數據支持
Pandas 和 Spark 操作相同類型的資料—表。然而,他們與之互動的方式卻截然不同。
然而,許多程式設計師經常將他們的學習從 Pandas 擴展到 Spark,假設類似的設計,這會導致效能瓶頸。
今天我給大家舉個例子。
注意:如果您想要一個適合初學者的資源來學習 PySpark,我在這裡介紹了它:不要停留在 Pandas 和 Sklearn!使用 PySpark 開始使用 Spark DataFrames 和大數據 M L。
背景
Spark 中可以執行兩種類型的操作:
轉換:從現有的 DataFrame 建立新的 DataFrame。
操作:這些操作會觸發資料幀上轉換的執行。
為了給您更多上下文,Spark 使用操作,因為與 Pandas 等常見 DataFrame 庫不同,Spark 轉換遵循惰性求值。
惰性評估意味著轉換不會立即產生結果。
相反,計算會延後到觸發某個操作為止,例如:
查看/列印資料。
將資料寫入儲存來源。
將資料轉換為Python列表等。
透過延遲評估 Spark 轉換並僅在需要時執行它們,Spark 可以建立邏輯執行計劃並應用任何可能的最佳化。
然而,這裡還有一個被忽視的警告,可能會導致冗餘計算。因此,如果處理不當,它會大幅減慢 Spark 程式的執行工作流程。
讓我們更詳細地了解一下。
惰性評估問題
考慮從儲存中讀取 Spark DataFrame (A) 並對其執行轉換,這會產生另一個 DataFrame (B)。
接下來,我們對 DataFrame B 執行兩個操作(計數行和查看資料),如下所示:
這可以在 PySpark 中翻譯成以下程式碼:
現在,回想一下我們上面討論的內容:操作觸發 Spark 轉換的執行。
在上面的程式碼中,第一個動作是df_B.count(),它觸發 CSV 讀取操作和過濾器轉換。
順便說一句,您可能已經注意到,執行方法與 Pandas 的工作方式有很大不同。它不提供惰性評估。因此,每個操作都會立即執行。
繼續,我們還有另一個動作:df_B.show()。此操作再次觸發 CSV 讀取操作和過濾器轉換。
你看到問題了嗎?
我們正在讀取 CSV 檔案並執行相同的轉換兩次。
顯然,在處理大型資料集時,這可能會導致嚴重的效能瓶頸。
解決方案
解決這個問題的常見方法是使用快取。
顧名思義,它允許我們將 Spark 轉換的結果緩存在記憶體中以供以後使用。
該df.cache()方法可以讓您做到這一點。
注意:除了 之外df.cache(),還有df.persist()method ,它為快取提供了更大的靈活性。但今天我們只討論df.cache()。
我們可以使用df.cache()以下方法:
在此程式碼中,第一個操作 ( df_B.count()) 觸發 CSV 讀取操作和過濾器轉換。
然而,與我們之前討論的非快取演示相反,這次過濾器轉換的結果被緩存。
繼續,第二個操作 ( df_B.show()) 使用這些快取的結果來顯示 的內容df_B。
很容易理解,快取消除了冗餘操作,從而大大提高了運行時間。
請注意,該df.cache()方法將 DataFrame 緩存在記憶體中。
因此,一旦不再需要緩存內存,建議將其釋放。我們可以使用df.unpersist()以下方法:
也就是說,Spark 是數據科學雇主最搶手的技能之一。將 Spark 添加到您的技能組合中將對您未來的數據科學職業生涯極其有價值。
我在 PySpark 上寫了一篇完整的適合初學者的深入探討(閱讀 102 分鐘):不要停留在 Pandas 和 Sklearn!使用 PySpark 開始使用 Spark DataFrames 和大數據 M L。
如果您是完全的初學者並且以前從未使用過 Spark,那也沒關係。這篇文章涵蓋了一切。
👉 接下來:還有哪些被忽視的 Spark 最佳化技術?
感謝您閱讀數據科學的每日劑量!免費訂閱,每天學習有關 Python 和數據科學的新知識和深刻見解。此外,還可以獲得包含 320 多個技巧的免費資料科學 PDF(550 多頁)。
訂閱
您是否對 ML/DS 中的資訊量感到不知所措?
我每週都會發布一些關於對您的 ML/DS 角色技能真正重要的主題的深入探討。