从数据集和RDD文档中,
数据集:
数据集是域特定对象的强类型集合可以使用函数或关系并行转换操作。每个数据集还具有称为DataFrame的非类型化视图,它是行的数据集
RDD:
RDD表示一个不可变的、分区的元素集合可以并行操作
此外,据说它们之间的区别:
主要区别在于,数据集是特定于域的集合对象,其中as RDD是任何对象的集合。域对象部分的定义表示数据集的模式部分。因此数据集API是总是使用模式进行强类型化和优化,而RDD不是。
我有两个问题;
-
dataset is collection of domain specific objects while RDD is collection of any object
是什么意思?给定一个事例类Person
,我认为DataSet[Person]和RDD[Person]都是特定于域的对象的集合 -
dataset API is always strongly typed and optimized using schema where RDD is not
为什么说数据集API总是强类型而RDD不是?我认为RDD(Person)也是强类型
强类型Dataset
(而非DataFrame
)是记录类型(ScalaProducts
)的集合,这些记录类型使用所谓的Encoders
映射到内部存储格式,而RDD
可以存储任意可串行化的(Serializable
或Kryo可串行化对象)。因此,作为容器,RDD
比Dataset
更通用。
以下内容:
。所以数据集API总是强类型的(…),而RDD不是。
是一个彻头彻尾的荒谬,表明你不应该相信你在互联网上能找到的一切。一般来说,Dataset
API的类型保护明显弱于RDD
。这在使用Dataset[Row]
时尤其明显,但适用于任何Dataset
。
例如,考虑以下内容:
case class FooBar(id: Int, foos: Seq[Int])
Seq[(Integer, Integer)]((1, null))
.toDF.select($"_1" as "id", array($"_2") as "foos")
.as[FooBar]
这显然破坏了类型安全性。