RDD、DataFrame、DataSet的關係是抽象關係

一、序言
可以說,RDD的使用是Spark最重要的抽象概念!
初學者可能不太理解這三者之間的關係,其實他們就是不斷地抽象、封裝,目的只有一個,Apache讓Spark讓你使用起來更簡單!功能更強大!

二、三者的介紹

  1. RDD:傳統MapReduce雖然也具有自動容錯、負載均衡、可拓展等特點,但是是採用非循環的數據流模型結構,這使得在迭代時要與HDFS產生大量的IO,RDD正是解決了這個缺點的抽象模型,其實質就是Spark可以把RDD的結果緩存到內存中,避免重複計算和產生大量IO。
  2. DataFrame:是RDD的封裝,作爲增強,DF還引入了off-heap機制,意味着JVM堆以外的內存直接受操作系統管理,避免數據量過大時頻繁的gc操作,此外DF還提供了更豐富的算子;我們還可以將DF看作是一個關係型數據表,然後可以通過在程序中使用spark.sql() 來執行SQL語句查詢,結果返回一個DataFrame還可以通過DF API或SQL處理數據會進過Spark優化器(catalyst)自動優化SQL,媽媽再也不擔心我寫的SQL爛了!
    但是,DF失去了RDD的強類型特性,這導致如果類型有錯,程序編譯打包都不會報錯
對於分佈式程序來講,提交一次作業太費勁了(要編譯、打包、上傳、運行),到提交到
集羣運行時才發現錯誤,這會浪費大量的時間,這也是引入Dataset的一個重要原因。

3、DataSet:saprk2.0之後DataSet和DataFrame進行了統一,DF表示爲DataSet[Row],也就是說DF成了DS的子集,相比DF,DS提供了編譯時類型的檢查

三、三者相同功能

  1. 所有transformation操作的特點都是lazy的(惰性的),只有action操作才能觸發執行。這就是函數式編程的好處,也是底層spark的優化:避免產生過多中間結果!
  2. 三者都會根據spark的內存情況自動緩存運算,這樣即使數據量很大,也不用擔心會內存溢出(彈性的,內存不夠使用磁盤)

四、三者的區別

  1. RDD不支持SparkSQLS操作
  2. dataSet 可以定義類型,可以定義類型,能對各種列進行各種精細操作,而dataFram 能註冊成表。然後直接寫sql語句就能操作了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章