Spark RDD、DataSet、DataFrame--区别(个人理解)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Enche/article/details/79754319

描述:实验将系统数据分别转换成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存着每个对象的属性值。










展开阅读全文

没有更多推荐了,返回首页