SparkSQL(2)——Spark SQL DataFrame概述
DataFrame是什麼?
DataFrame的前身是SchemaRDD,從Spark 1.3.0開始SchemaRDD更名為DataFrame。 DataFrame與SchemaRDD的主要區別是:DataFrame不再直接繼承自RDD,而是自己實現了RDD的絕大多數功能。但仍舊可以在DataFrame上呼叫rdd方法將其轉換為一個RDD。
DataFrame是一種以RDD為基礎的分散式資料集,類似於傳統資料庫的二維表格。 DataFrame帶有Schema元資訊,即DataFrame所表示的二維表資料集的每一列都帶有名稱和型別,但底層做了更多的優化。 DataFrame可以從很多資料來源構建,比如:已經存在的RDD、結構化檔案、外部資料庫、Hive表。
DataFrame與RDD的區別
RDD可看作是分散式的物件的集合,Spark並不知道物件的詳細模式資訊; DataFrame可看作是分散式的Row物件的集合,其提供了由列組成的詳細模式資訊,使得Spark SQL可以進行某些形式的執行優化。 DataFrame和普通的RDD的邏輯框架區別如下所示:
左側的RDD[Person]雖然以Person為型別引數,但Spark框架本身不瞭解 Person類的內部結構。 而右側的DataFrame卻提供了詳細的結構資訊,使得Spark SQL可以清楚地知道該資料集中包含哪些列,每列的名稱和型別各是什麼,DataFrame多了資料的結構資訊,即schema。這樣看起來就像一張表了,DataFrame還配套了新的操作資料的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。 總結:RDD中每以行資料是一個java物件,DataFrame中每一行資料是一個Row物件,DataFrame比rdd多了對資料的描述資訊,這個資訊就是schema元資訊。
DataFrame與RDD的優缺點比較
RDD的優缺點:
優點: (1)編譯時型別安全 :編譯時就能檢查出型別錯誤 (2)面向物件的程式設計風格 :直接通過物件呼叫方法的形式來操作資料 缺點: (1)序列化和反序列化的效能開銷 無論是叢集間的通訊, 還是IO操作都需要對物件的結構和資料進行序列化和反序列化。 (2)GC的效能開銷 頻繁的建立和銷燬物件, 勢必會增加GC
DataFrame的優缺點:
dataFrame引入了schema和off-heap(不使用堆中的記憶體,直接使用作業系統層面的上的記憶體) 優點: (1)序列化和反序列化資料傳輸量大大減少 由於引入了schema,後期再進行資料網路傳入的時候就只需要把資料本身進行序列化和反序列化即可,針對於資料的結構這一塊就可以省略。 (2)程式中就不會出現大量的GC 由於引入了off-heap,這個時候程式中大量物件的建立就不在jvm堆中,直接使用作業系統層面上的記憶體,這個時候就避免頻繁的GC,提升了效能 缺點: dataFrame由於引入了schema和off-heap,分別解決了RDD的缺點,但是同時也丟失了RDD的優點 (1)編譯時型別不安全 (2)不具有面向物件程式設計的風格