Spark SQL DataSet and DataFrame
DataSet
- 分布式的資料集合
- Spark 1.6後開始支持
- 增強RDD的特性:
- 支持強類型(Strong typing)
- 支持Lambda方法
- 可使用Spark SQL的最佳化執行引擎來執行DataSet操作
- 可以使用JVM物件來構建,或者執行transformation方法來構建,例如map,flatMap等等
- 可以使用Java或Scala來進行操作,Python暫時不支持DataSet API
DataFrame
- 等同於DataSet,其中的columns帶有名稱
- Spark 1.3之前稱作SchemaRDD,Spark 1.3開始用DataFrame取代,兩者在本質上沒有區別,都是將Schema作用於RDD之上
- 類似於relational database中的table,或者Python或R內的DataFrame,並且透過底層的優化提升效率
- 構建DataFrame的方法:
- 結構化的資料文件
- Hive中的table
- 外部的database
- 已構建出來的RDD
- 支持Scala、Java、Python與R
- 在Scala與Java當中,DataFrame使用Row類型的DataSet來表示,及為Dataset[Row]
- 引用DataFrame後,無論是在處理小量數據或者分布式數據的處理上,程式處理上皆可以使用相同的方式進行處理
RDD vs. DataFrame
透過上圖可以得知:
- RDD只能闡述整體紀錄的類型,而DataFrame可以闡述每個紀錄中column的名稱與類型
- DataFrame中每一個column皆為相同類型,故可以得到更好壓縮比例,整體的存儲會比RDD減少很多
- 因為DataFrame可以闡述每個紀錄中column的名稱與類型,故在操作處理上可以進行更深入的優化
- 使用RDD進行編寫程式時,不同的實作語言有著不同的底層處理,Java/Scala的底層是使用JVM,而Python則是Python直譯器,故不同實作程式在效能上有所差異
- DataFrame無論實作程式語言,皆會透過Catalystu優化後得到Logic Plan,最後到執行環境開始執行,故不同實作程式在效能上是沒有差異的