1. 程式人生 > >Spark RDD、DataSet、DataFrame--區別(個人理解)

Spark RDD、DataSet、DataFrame--區別(個人理解)

描述:實驗將系統資料分別轉換成RDD,DataSet、DataFrame,然後進行比較,資料有四列,分別起名為a、b、c、d。

class People(a:String, b:String, c:String, d:String)

RDD:轉換成RDD[People]後,發現每個記錄為一個People物件,在進行map操作時候,若想對每個記錄進行操作,必須通過map(p=>p.屬性) 通過p.屬性進行每個People物件操作。但是直接從RDD上來看,是看不出來People的屬性。

scala> peoples

peoples  res20: org.apache.spark.rdd.RDD[People] = MapPartitionsRDD[2] at map at <console>:27

scala> peoples.map(p=>p.)

a   canEqual   equals         productElement    toString   

b   copy       hashCode       productIterator              
c   d          productArity   productPrefix                

scala> peoples.map(p=>p.)

 p.的候選項可以看出需要通過p.屬性名操作記錄物件的屬性

DataFrame:轉換成DataFrame後,每行為一個Row,可以從表面上看出來這個Row有哪些屬性,每個屬性可以看作資料庫表的一列,在進行map操作時,需要選中想要操作的列。

scala> df

res0: org.apache.spark.sql.DataFrame = [a: string, b: string ... 2 more fields]

scala> df.map(p=>p.)
anyNull      getBoolean   getJavaMap   getStruct      schema     
apply        getByte      getList      getTimestamp   size       
copy         getDate      getLong      getValuesMap   toSeq      
equals       getDecimal   getMap       hashCode       toString   
fieldIndex   getDouble    getSeq       isNullAt                  
get          getFloat     getShort     length                    
getAs        getInt       getString    mkString                  

scala> df.map(p=>p.)

p.的候選項可以看出需要通過選擇相應返回值型別和對應的列來進行操作。

例如:scala> df.map(p=>p.getString(0))

選取第一列的值,然後將值作為String型別返回。

DataSet:轉換成DataSet[People]後,每行為一個People物件。

scala> ds
res1: org.apache.spark.sql.Dataset[People] = [a: string, b: string ... 2 more fields]

與RDD不同點:RDD每個Record為一個物件,DataSet每個Record為一個已知型別的物件,儲存的是物件的屬性。

與DataFrame不同點:DataFrame每個Record為Row,每個Row存著每個物件的屬性值。