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 上,它说 Dataframe 是 Dataset[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另外如果Dataframe是Dataset[Row],那为什么要单独定义Dataframe呢?此外,Dataset 的每个操作也应该可以在 Dataframe 上调用。如果以上陈述不正确或有些正确,请随时回答。
如果这些问题过于宽泛,请告诉我。我会根据需要编辑它们。
【问题讨论】:
谁投了反对票,你能解释一下这个问题有什么问题吗? 【参考方案1】:简而言之,外部 API 的连续性(从 Shark,现已删除,通过 SchemaRDD
和 DataFrame
到 Dataset[Row]
)并不意味着内部连续性。内部 API 经历了重大变化,当前的实现甚至不像最初的 Spark SQL 尝试。
1.3中没有Dataset
这样的东西,直到2.0之前DataFrame
也没有和Dataset
统一。
这几乎不是精确的描述(与“强类型”的高度非正式用法相同)。它指的是两个事实:
Row
是 Any
的容器(集合式),因此不可能进行有意义的 static 类型。这并不意味着它是“无类型的”(Any
是类型层次结构的有效元素),但它根本不向编译器提供有用的信息。
在DataFrame
DSL 级别缺乏类型检查,这与另一点相同是相当具有误导性的,因为它完全保留了类型系统约束。
所以从根本上说,它相对于一些理想主义的、不存在的系统来说是“无类型的”,在该系统中,编译器会保护所有可能的运行时故障。在更现实的情况下,它区分了选择的实现和面向类型的变体(如无框架),后者又受到 JVM 作为平台的一些实际限制(是的,我在说你,宽数据)。
另外如果Dataframe是Dataset[Row],那为什么要单独定义Dataframe呢?此外,Dataset 的每个操作也应该可以在 Dataframe 上调用。
这是正确的,但并不意味着相反。 Dataset[Row]
是Dataset
的一个特定案例 - 它必须提供至少与一般Dataset[_]
一样多的功能,但可以提供更多。而事实正是如此。
此外,保持向后兼容性是“一种特殊情况”,尤其是当“强类型”变体比专门的DataFrame
操作更不受欢迎且通常效率更低时。
【讨论】:
以上是关于Spark 中的数据框和数据集的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Spark 2.0 中的 DataFrame 列创建数据集?