首页 > 解决方案 > Spark 中的数据框和数据集

问题描述

我是 Spark 的新手,正在研究 Dataframes 和 Dataset。我试图了解它们之间的区别,但我很困惑。
我从这里开始,发现RDD的抽象是按以下顺序发生的。

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

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

Q.2在这里的链接上,它说,

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

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

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

如果这些问题感觉很广泛,请告诉我。我会根据需要编辑它们。

标签: apache-sparkapache-spark-sqlapache-spark-dataset

解决方案


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

    Dataset1.3没有这种东西,直到2.0才DataFrame统一。Dataset

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

    • Row作为一个容器(collection-ish),Any因此不可能有有意义的静态类型。这并不意味着它是“无类型的”(Any是类型层次结构的有效元素),但它根本不向编译器提供有用的信息。

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

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

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

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

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


推荐阅读