Spark 中的数据框和数据集

Posted

技术标签:

【中文标题】Spark 中的数据框和数据集【英文标题】:Dataframes and Datasets in Spark 【发布时间】:2019-02-15 17:39:05 【问题描述】:

我是 Spark 的新手,正在研究 Dataframes 和 Dataset。我试图了解它们之间的区别,但我很困惑。 启动here,发现RDD的抽象是按如下顺序发生的。

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

Q.1 在链接 here 上,它说 DataframeDataset[Row 的别名] 即 Dataset 类型的 Row。如果 Dataframe 是首先完成的 RDD 的抽象,这是否意味着 Dataset 已经存在于 Spark1.3 或当 Spark1.6 被开发出来时,Dataframe 被重新定义为 Dataset[Row]

Q.2在链接 here 上,它说,

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

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

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

如果这些问题过于宽泛,请告诉我。我会根据需要编辑它们。

【问题讨论】:

谁投了反对票,你能解释一下这个问题有什么问题吗? 【参考方案1】:

    简而言之,外部 API 的连续性(从 Shark,现已删除,通过 SchemaRDDDataFrameDataset[Row])并不意味着内部连续性。内部 API 经历了重大变化,当前的实现甚至不像最初的 Spark SQL 尝试。

    1.3中没有Dataset这样的东西,直到2.0之前DataFrame也没有和Dataset统一。

    这几乎不是精确的描述(与“强类型”的高度非正式用法相同)。它指的是两个事实:

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

    DataFrame DSL 级别缺乏类型检查,这与另一点相同是相当具有误导性的,因为它完全保留了类型系统约束。

    所以从根本上说,它相对于一些理想主义的、不存在的系统来说是“无类型的”,在该系统中,编译器会保护所有可能的运行时故障。在更现实的情况下,它区分了选择的实现和面向类型的变体(如无框架),后者又受到 JVM 作为平台的一些实际限制(是的,我在说你,宽数据)。

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

    这是正确的,但并不意味着相反。 Dataset[Row]Dataset一个特定案例 - 它必须提供至少与一般Dataset[_] 一样多的功能,但可以提供更多。而事实正是如此。

    此外,保持向后兼容性是“一种特殊情况”,尤其是当“强类型”变体比专门的DataFrame 操作更不受欢迎且通常效率更低时。

【讨论】:

以上是关于Spark 中的数据框和数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spark 2.0 中的 DataFrame 列创建数据集?

如何将具有值的列添加到 Spark Java 中的新数据集?

JSON 到 Spark 中的数据集

如何遍历 spark 数据集并更新 Java 中的列值?

我们如何在 Apache Spark 中执行动态重新分区?

如何在 Scala 中将数据帧转换为 Apache Spark 中的数据集?