Apache Spark是一個開源的分佈式通用集羣計算框架。 最初由加州大學伯克利分校的AMPLab開發,Spark代碼庫後來被捐贈給Apache軟件基金會,該基金會從那時起就一直在維護它。

三分鐘搞清楚Spark的RDD、Dataset和DataFrame三個數據模型

Spark的最早使用的數據模型是RDD(彈性分佈式數據集,Resilient Distributed Dataset)。它是Spark對數據的一種抽象,是一種數據結構。

三分鐘搞清楚Spark的RDD、Dataset和DataFrame三個數據模型

從一開始RDD就是Spark提供的面向用戶的主要API。從根本上來說,一個RDD就是你的數據的一個不可變的分佈式元素集合,在集羣中跨節點分佈,可以通過若干提供了轉換和處理的底層API進行並行處理。

與RDD相似,DataFrame也是數據的一個不可變分佈式集合。但與RDD不同的是,數據都被組織到有名字的列中,就像關係型數據庫中的表一樣。設計DataFrame的目的就是要讓對大型數據集的處理變得更簡單,它讓開發者可以爲分佈式的數據集指定一個模式,進行更高層次的抽象。它提供了特定領域內專用的API來處理你的分佈式數據,並讓更多的人可以更方便地使用Spark,而不僅限於專業的數據工程師。

借用網上的一組圖:

三分鐘搞清楚Spark的RDD、Dataset和DataFrame三個數據模型

我們可以看到,其實DataFrame相比較RDD能更瞭解數據內部的結構。

從Spark2.0開始,Spark整合了Dataset和DataFrame,前者是有明確類型的數據集,後者是無明確類型的數據集。根據官方的文檔:

Dataset是一種強類型集合,與領域對象相關,可以使用函數或者關係進行分佈式的操作。每個Dataset也有一個無類型的試圖,叫做DataFrame,也就是關於Row的Dataset。簡單來說,Dataset一般都是Dataset[T]形式,這裏的T是指數據的類型,如上圖中的Person,而DataFrame就是一個Dataset[Row]。

關於Dataset的優點其實主要是執行效率更高,運行時類型安全。

因此,以後Spark的數據集操作都可以統一成使用Dataset。Dataset包含兩種操作,一種是轉換操作(transformations),一種是action操作。轉換操作是產生一個新的Dataset,而actions操作則是出發一個計算並返回結果。轉換操作包括如map、filter、select以及aggregate(groupby)。actions則包括count、show或者將數據集寫入文件。

Datasets是懶加載的,即只有actions被調用的時候纔會觸發計算。在內部,Dataset代表一個邏輯計劃,用來描述產生數據需要的計算。當一個action被調用的時候,Spark的query優化器會優化這個邏輯計劃並以分佈式的方式在物理上進行實際的計算操作。想要了解邏輯計劃以及優化的物理方案,可以使用explain函數查看。

查看原文 >>
相關文章