Spark教學(三) - Spark DataFrame 轉換 Pandas DataFrame

目錄

前言

資訊
本篇文章接續前篇 Spark教學(二) - Jupyter 的建置結果,繼續往下編寫處理邏輯。如果手上還沒有可用的環境,建議先依照前兩篇的步驟完成安裝,跟著本篇操作會更順暢。

PySpark 與 Pandas 的互相轉換

相信在資料處理這條路上,大家更早接觸到的工具通常是 Python 的 Pandas 套件。在小資料量的情境下,用 Pandas 確實能很輕巧地把資料處理成想要的結果。過去開發人員在導入 PySpark 時,常會遇到一個困擾:一旦資料規模擴大、需要換到 PySpark 處理,邏輯往往得因為工具不同而重新改寫。雖然稱不上多困難,但終究是多花了一筆學習與轉換成本。

不過到了 Spark 3.2,這件事有了突破性的進展。PySpark 正式把 Pandas API 併入其中,我們可以直接用 PySpark 套用 Pandas 慣用的操作方式,甚至能在兩者的資料格式之間自由互轉。這意味著我們不只是能用 Pandas 的語法,過去在 Pandas 生態系裡常搭配的套件(例如 NumPy、SciPy)也能一併沿用,讓資料處理更有彈性。而在這中間,真正把轉換效率拉起來的關鍵是 pyarrow 套件——它省下了過去 Python 資料要傳遞到以 Java 為底層的 Spark 之間,那一段沉重的序列化與反序列化開銷。

接下來,我們透過幾個簡單的範例,讓大家實際感受一下這個轉變。

Pandas DataFrame 呈現結果

這裡是用 Pandas 來轉換資料並呈現結果的方式:

pandas

Spark DataFrame 呈現結果

警告
pandas API on Spark 底層預設的繪圖套件是 Plotly,如果想要跟原生 Pandas 的繪圖結果完全一致,需要手動切換成 matplotlib。

透過相同的流程建立資料集、進行聚合並繪圖,呼叫的函式名稱幾乎都跟 Pandas 一模一樣:

spark

Pandas DataFrame 與 Spark DataFrame 互相轉換

警告

把 Spark DataFrame 轉換回 Pandas 時,如果資料量很大,很容易遇到記憶體不足的問題。建議先用取樣的方式縮小資料量再拉回本機,例如:

1
sample_df = ps_df.sample(frac=0.1).to_pandas()

在 pandas API on Spark 底下,兩種格式是可以直接互相轉換的,請看以下範例:

1
2
ps_df = ps.DataFrame(df)   # 將 Pandas DataFrame 轉換為 Spark DataFrame
pd_df = ps_df.to_pandas()  # 將 Spark DataFrame 轉換回 Pandas DataFrame

change

結語

透過這樣的互相轉換,過往「換工具就得重寫邏輯」的痛點算是被打破了。開發情境可以從輕巧的 Pandas 一路擴展到 Spark,而不需要大幅改動程式碼——對日常開發來說,這確實是相當方便的一項進展。

目錄