# Spark 語言選擇: Scala vs. python

Spark 一共支援四種不同的程式語言: Java、Scala、Python 以及 R。然而，考慮到 Java 語言並不直觀，R 語言的支援過少，通常，對於 Spark 的使用者而言，主要考慮的程式語言就是 Scala 和 Python。

然而，考慮到 Spark 擁有需多種 API，像是: Spark SQL、MLlib、GraphX (圖運算)、Spark Streaming，以及不同的資料接口，像是: RDD、DataFrame、DataSet，要選擇一個適合的程式語言並不是一件簡單的事。

此篇文章主要參考的論點來自:&#x20;

* <https://stackoverflow.com/questions/32464122/spark-performance-for-scala-vs-python>
* <https://dzone.com/articles/scala-vs-python-for-apache-spark>
* [https://www.kdnuggets.com/2018/05/apache-spark-python-scala.html  ](https://www.kdnuggets.com/2018/05/apache-spark-python-scala.html)

## 整體 API 完整性

Spark 的核心基本上是基於 Scala，Scala 擁有最完整的 API 支援。因此，當使用 Spark 平台運算時，應該要基本了解 Scala 語言，並可以了解 Spark 的運算特性。同時，如果需要去修改 Spark 的原始碼，一定要了解 Scala 語言。

## 基於資料型態 API 的比較

在 Spark 中，有三種不同的資料型態: RDD、DataSet、DataFrame。其中，RDD 基本上支援了 Python 以及 Scala 兩種語言，然而，考慮到 RDD-based API 將在 Spark 3.0 中停止開發，我們應該更重視 DataSet 和 DataFrame 的部分。

DataSet 因為是 statically typed 的資料型態，因此 Python 語言的特性無法支援 DataSet 的型態。DataFrame 的格式 Python 可以支援，且不論 Scala 和 Python 兩種語言都是由於 Catalyst 進行 RDD 的最佳化，因此，兩種程式語言之間不應存在有巨大的效能差異。

對於 RDD 的資料型態而言，Python 存在以下的問題: 第一、Python 本身不支援完整的平行化 (heavy-weight process fork)，且 multi-thread 計算時有一些 overhear 的問題，在平行化的效率來說，比起 Scala 來得差。另一方面，由於 Scala 是編譯後執行的語言，Python 則是交互式編譯語言，因此，Scala 比起 Pyhton 更加安全且有效率。針對 RDD 的比較可以顯示如下表:

|                   | Scala                                                   | Python                                                             |
| ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------ |
| Performance       | 10X faster than Python                                  | Slower                                                             |
| Learning Curve    | <p>Not easy for Java people;</p><p>Less programmer;</p> | <p>Easier than Scala;</p><p>More examples;</p><p>More popular;</p> |
| Concurrency       | Based on JVM (better)                                   | <p>Does not support <br>heavy-weight process fork</p>              |
| Type Safety       | Statically typed                                        | Dynamically typed                                                  |
| Advanced Features | Spark Streaming                                         | Machine Learning                                                   |

雖然，以效能而言，Python 比起 Scala 而言好像不是一個好的選擇，但是若考慮到程式語言的簡便性 (Python 比起 Scala 容易學習，且學習的資源也較多)，社群的支援 (Python 的使用者基底是 Scala 的數倍)，以及跨計算平台的資源 (許多 Machine Learning 的工具都是以 Python 完成)，Python 在 Spark 平台上仍有許多的擁護者。

## 基於不同應用 API 的比較

主要討論 Spark SQL、MLlib 以及 Spark Streaming。GraphX 沒有提供Python API (Scala 2.1)，因此不討論。

### Spark SQL 和 MLlib

由於 Spark SQL 的核心為 DataFrame 與 DataSet 資料型態，而 MLlib 未來將轉移到 DataFrame-based API，因此，我們放在一起討論。首先，對於 RDD-based API 的 MLlib 比較而言，可以參考上一個小節中的表格比較。對於 DataFrame-based API 而言，兩種語言的效能應該要一致，換句話說，當使用 Python 來進行 MLlib 操作時，要盡量減少 RDD 和 DataFrame 兩種型態的轉換。

另一方面，Python 有許多額外的 Machine Learning 的資源，例如，像是 deep learning 或是其他的計算架構。若是要結合 Spark 的計算結果以及其他計算平台，Python 可以提供較好的跨平台支援。

### Spark Streaming

雖然 Python 支援 Spark Streaming，不過，Python 版本的 Spark Streaming 不支援格式化的 DStream，因此，在效能上，比起 Scala 版本的 Spark Streaming 效率低上不少。

考慮到 Spark Streaming 相對其他應用而言，仍在早期的階段，因此，基於其原生語言 (Scala) 的支援較多，也較穩定。但是以程式的架構來說，Python 在 Spark Streaming 中並沒有太多先天上的劣勢，或許在未來開發完整後會有不同的結果。

{% hint style="info" %}
在目前版本 (2.4.3) 中，Spark Streaming 已經對 python 友善許多，但是可以看到許多 API 仍然是無法兼容，而標記為 python API。相較 Scala 版本的 Spark Streaming 而言，兩者最大的差別應該是在對自有 receiver 的支援 (應該就是上述所說的格式化的 DStream)。
{% endhint %}
