Spark中的数据框和数据集

时间:2019-02-15 17:39:06

标签: apache-spark apache-spark-sql apache-spark-dataset

我是Spark的新手,正在经历Dataframes和Dataset。我试图理解它们之间的区别,但感到困惑。
我开始here,发现 RDD 的抽象顺序如下。

RDD(Spark1.0)—>数据框(Spark1.3)—>数据集(Spark1.6)

Q.1 在链接here上,说 Dataframe Dataset [ Row ],即 Row 类型的 Dataset 。如果 Dataframe 是首先完成的 RDD 的抽象,则表示 Spark1.3 中已经存在 Dataset 或当开发 Spark1.6 时, Dataframe 被重新定义为 Dataset [Row]

第二季度,在链接here上,

  

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

如果 Dataframe 实际上是 Dataset [Row] ,为什么 Dataframe 被称为无类型的?这里的类型不是 Row [defined here]吗?

Q.3 另外,如果 Dataframe Dataset [Row] ,那么为什么还要分别定义 Dataframe ?同样, Dataset 的每个操作也应在Dataframe上可调用。如果以上陈述不正确或有些正确,请随时回答。

如果您对这些问题有广泛的看法,请告诉我。我将根据需要对其进行编辑。

1 个答案:

答案 0 :(得分:1)

  1. 简而言之,外部API的连续性(从Shark,现在已删除,通过SchemaRDDDataFrameDataset[Row])并不意味着内部连续性。内部API进行了重大更改,当前的实现甚至与最初的Spark SQL尝试都不相似。

    在1.3版中没有Dataset这样的东西,在2.0版之前,DataFrame还没有与Dataset统一。

  2. 这很难准确描述(与“强类型”的高度非正式用法相同)。它涉及两个事实:

    • RowAny的容器(收集类),因此不可能进行有意义的 static 键入。这并不意味着它是“未类型化的”(Any是类型层次结构中的有效元素),但是它根本无法为编译器提供有用的信息。

    • DataFrame DSL级别上缺乏类型检查,这与另一点很相似,因为它完全保留了类型系统约束,因此具有误导性。

    因此,从根本上来说,它是相对于某些理想主义的,并且不存在的系统“无类型的”,在该系统中,编译器为所有可能的运行时故障提供保护。在更现实的情况下,它区分了选择的实现和面向类型的变体(如无框架),这些变体又受JVM作为平台的一些实际限制(是的,我在谈论您,是广泛的数据)。

  3.   

    如果Dataframe是Dataset [Row],那么为什么还要单独定义Dataframe?同样,Dataset的每个操作也应该可以在Dataframe上调用。

    是正确的,但这并不意味着相反。 Dataset[Row]Dataset的一种特殊情况-一般而言,它必须至少提供Dataset[_]的数量,但可以提供更多的数量。确实是这样。

    此外,保留向后兼容性是“特殊情况”,特别是在“强类型”变体的情况下,与专用DataFrame操作相比,它不那么受欢迎,并且通常效率较低。