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