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


<!--more-->

## 前言

{{< admonition info >}}
本篇文章接續前篇 **[Spark教學(二) - Jupyter](https://as183789043.github.io/theme-document-spark-install-extend/)** 的建置結果，繼續往下編寫處理邏輯。如果手上還沒有可用的環境，建議先依照前兩篇的步驟完成安裝，跟著本篇操作會更順暢。
{{< /admonition >}}

</br>

## 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](./pandas.png)

## Spark DataFrame 呈現結果

{{< admonition warning >}}
pandas API on Spark 底層預設的繪圖套件是 Plotly，如果想要跟原生 Pandas 的繪圖結果完全一致，需要手動切換成 matplotlib。
{{< /admonition >}}

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

![spark](./spark.png)

## Pandas DataFrame 與 Spark DataFrame 互相轉換

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

```python
sample_df = ps_df.sample(frac=0.1).to_pandas()
```
{{< /admonition >}}

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

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

![change](./change_back.png)

## 結語

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

---

> 作者: Rick  
> URL: https://as183789043.github.io/zh-tw/theme-document-spark-query-with-pandas/  

