三种数据结构出现的版本顺序
RDD (Spark1.0) --> Dataframe(Spark1.3) --> Dataset(Spark1.6)
RDD
rdd的五大特性 这个用了很多,但是当突然被问到五大特性时,竟然一时卡壳,只记得弹性可分区和容错 ,而血统、依赖和数据本地化并没有归并到特性中,重新查看资料后,发现自己错在把rdd当成一种数据集合,
- 可分区列表:可以创建指定分区数目,可以生成新的rdd来改变分区数
- 作用在分区的函数:rdd的计算都是以分区为单位
- 依赖关系:rdd记录上级rdd是谁,从而实现容错和计算,也称为血统
- 分区函数:计算数据应该发往哪一个分区,作用在key-value 类型的数据
- 数据本地化:移动数据不如移动计算,因此需要记录每一个rdd分区最好存在什么位置
dateSet和DateFrame
dateSet中的底层是rdd,数据类型是InternalRow,即不论存入的数据是什么类型,在底层处理的数据结构都是InternalRow
val internalRDD: RDD[InternalRow] = dataset.queryExecution.toRdd
转换是通过Encoder将数据转为InternalRow,输出之前通过Decoder转换为泛型对象
DataFrame 是 Dataset 的一种特殊情况, 也就是说 DataFrame 是 Dataset[Row] 的别名 源码中可以看出来 可以理解为底层也是rdd

dataset和dataframe区别
处理对象
- dataFrame处理的数据类型永远是row类型,dataset可以是任意类型
- dataframe只能做到运行时类型检查,dataset能做到编译和运行时都有类型检查
- dataframe只能通过表达式或列形式访问数据,可以当作是一张表,dataset针对的是整个对象的操作
- 都支持sql和api操作 df.as方法装成ds
dataframe和rdd的区别

- dataframe引入schema 而Rdd没有schema信息
- rdd何以处理结构化和非结构化数据,dataframe一般处理结构化和板结构化数据
- rdd针对的是一个对象,dataframe针对的是列数据
- rdd运行在jvm 会频繁的创建销毁对象,GC压力大 。dataframe引入off-heap内存 gc压力小
- rdd是编译时类型安全的,dataframe是编译时类型不安全的
- rdd序列化性能消耗大,需要序列化数据和数据类型,dataframe只需要序列化数据即可 ;
- datafram有自动优化机制
rdd的运行步骤可以大致理解为 :先将rdd解析为有stage组成的DAG,后将stage转为Task直接运行。
因为任务是按照代码所示运行,运行效率高低依赖开发者的优化水平;
spark-sql并不是直接生成执行计划交给集群执行,而经过一个Catalyst的优化器优化后再去执行;
dataSet集合了rdd和dataframe的优点
dataset和rdd一样是强类型的,编译类型安全检查,也有dataframe的查询优化特性
使用off-heap gc压力小
1613

被折叠的 条评论
为什么被折叠?



