Apache spark 理解RDD和数据集

Apache spark 理解RDD和数据集,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,从数据集和RDD文档中 数据集: 数据集是特定于域的对象的强类型集合 可以使用函数或关系进行并行转换 操作。每个数据集还有一个称为DataFrame的非类型化视图, 这是行的数据集 RDD: RDD表示一个不可变的、分区的元素集合 可以并行操作 此外,据说它们之间的区别是: 主要区别在于,数据集是特定领域的集合 对象,其中as RDD是任何对象的集合。域对象部分 of definition表示数据集的模式部分。所以数据集API是 在不使用RDD的情况下,始终使用模式进行强类型和优化 我这里有两个

从数据集和RDD文档中

数据集:

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

RDD:

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

此外,据说它们之间的区别是:

主要区别在于,数据集是特定领域的集合 对象,其中as RDD是任何对象的集合。域对象部分 of definition表示数据集的模式部分。所以数据集API是 在不使用RDD的情况下,始终使用模式进行强类型和优化

我这里有两个问题

  • 当RDD是任何对象的集合时,
    数据集是特定于域的对象的集合,这意味着什么?给定一个案例类
    Person
    ,我认为数据集[Person]和RDD[Person]都是特定于域的对象的集合

  • 数据集API始终是强类型的,并使用RDD不存在的模式进行优化
    为什么说数据集API始终是强类型的,而RDD不存在?我认为RDD[Person]也是强类型的


  • 强类型
    数据集
    (不是
    数据帧
    )是一组记录类型(Scala
    产品
    ),使用所谓的
    编码器
    映射到内部存储格式,而
    RDD
    可以存储任意可序列化(
    可序列化
    或Kryo可序列化对象)。因此,作为一个容器,
    RDD
    Dataset
    更通用

    以下:

    。所以数据集API总是强类型的(…),而RDD不是

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

    考虑以下示例:

    case class FooBar(id: Int, foos: Seq[Int])
    
     Seq[(Integer, Integer)]((1, null))
       .toDF.select($"_1" as "id", array($"_2") as "foos")
       .as[FooBar]
    

    这显然破坏了类型安全。

    谁将我的问题标记为关闭?为什么要关门?