了解RDD和DataSet

时间:2017-11-06 09:38:25

标签: apache-spark apache-spark-sql

从DataSet和RDD文档中

数据集:

  

数据集是特定于域的对象的强类型集合   可以使用函数或关系并行转换   操作。每个数据集还有一个名为DataFrame的无类型视图,   这是一个行数据集

RDD:

  

RDD表示一个不可变的,分区的元素集合   可以并行操作

另外,据说它们之间存在差异:

  

主要区别在于,数据集是特定于域的集合   RDD是任何对象集合的对象。域对象部分   定义表示数据集的模式部分。所以数据集API就是   始终使用不使用RDD的模式强类型化和优化。

我在这里有两个问题;

  1. 这是什么意思dataset is collection of domain specific objects while RDD is collection of any object,给定案例类Person,我认为DataSet [Person]和RDD [Person]都是域特定对象的集合

  2. dataset API is always strongly typed and optimized using schema where RDD is not为什么说数据集API总是强类型而RDD不是?我以为RDD [Person]也是强类型的

1 个答案:

答案 0 :(得分:3)

强类型Dataset(不是DataFrame)是记录类型的集合(Scala Products),它们使用所谓的Encoders映射到内部存储格式,而{ {1}}可以存储任意可序列化(RDD或Kryo可序列化对象)。因此,容器SerializableRDD更通用。

下列的程序:

  

。因此,数据集API始终是强类型的(...),其中RDD不是。

是完全荒谬的,表明你不应该相信你在互联网上可以找到的一切。一般来说,Dataset API的类型保护功能明显弱于Dataset。这在工作RDD时尤其明显,但适用于任何Dataset[Row]

考虑以下示例:

Dataset

明显打破了类型安全。