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

前言
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 來轉換資料並呈現結果的方式:

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

Pandas DataFrame 與 Spark DataFrame 互相轉換
把 Spark DataFrame 轉換回 Pandas 時,如果資料量很大,很容易遇到記憶體不足的問題。建議先用取樣的方式縮小資料量再拉回本機,例如:
|
|
在 pandas API on Spark 底下,兩種格式是可以直接互相轉換的,請看以下範例:
|
|

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