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

本文探讨了Spark中的三种数据处理方式:RDD、DataSet和DataFrame。通过实例展示了它们之间的区别。RDD操作需要明确指定People对象的属性,而DataFrame直观显示列名并按列操作。DataSet作为RDD和DataFrame的结合,存储已知类型的对象属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值