Spark SQL DataSet and DataFrame

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,最後到執行環境開始執行,故不同實作程式在效能上是沒有差異的