apache-spark - Spark 中的数据框和数据集
问题描述
我是 Spark 的新手,正在研究 Dataframes 和 Dataset。我试图了解它们之间的区别,但我很困惑。
我从这里开始,发现RDD的抽象是按以下顺序发生的。
RDD (Spark1.0) —> 数据帧(Spark1.3) —> 数据集(Spark1.6)
Q.1在这里的链接上,它说Dataframe是Dataset [ Row ] 的别名,即Row类型的Dataset。如果Dataframe是首先完成的RDD的抽象,这是否意味着Dataset已经存在于Spark1.3或 Spark1.6 开发时Dataframe被重新定义为Dataset[Row]?
Q.2在这里的链接上,它说,
“数据集是特定领域对象的强类型集合,可以使用函数或关系操作并行转换。每个数据集还有一个称为数据帧的无类型视图,它是行数据集。”
如果,Dataframe实际上是Dataset[Row]为什么Dataframe被称为无类型?这里的类型不应该是Row [在这里定义]?
Q.3另外,如果Dataframe是Dataset[Row],那么为什么要单独定义Dataframe呢?此外, Dataset的每个操作也应该可以在 Dataframe 上调用。如果以上陈述不正确或有些正确,请随时回答。
如果这些问题感觉很广泛,请告诉我。我会根据需要编辑它们。
解决方案
简而言之,外部 API 的连续性(来自 Shark,现在已删除,通过
SchemaRDD
和DataFrame
toDataset[Row]
)并不意味着内部连续性。内部 API 经历了重大变化,当前的实现甚至不像最初的 Spark SQL 尝试。Dataset
1.3没有这种东西,直到2.0才DataFrame
统一。Dataset
这几乎不是精确的描述(与“强类型”的高度非正式用法相同)。它涉及两个事实:
Row
作为一个容器(collection-ish),Any
因此不可能有有意义的静态类型。这并不意味着它是“无类型的”(Any
是类型层次结构的有效元素),但它根本不向编译器提供有用的信息。在 DSL 级别缺乏类型检查
DataFrame
,这与另一点相同是相当具有误导性的,因为它完全保留了类型系统约束。
所以从根本上说,相对于一些理想主义的、不存在的系统来说,它是“无类型的”,其中编译器保护所有可能的运行时故障。在更现实的场景中,它区分了选择的实现和面向类型的变体,如无框架,这反过来又是 JVM 作为平台的一些实际限制的主题(是的,我说的是你,宽数据)。
另外如果Dataframe是Dataset[Row],那为什么要单独定义Dataframe呢?此外,Dataset 的每个操作也应该可以在 Dataframe 上调用。
这是正确的,但并不意味着相反。
Dataset[Row]
是一个特定的例子Dataset
——它必须提供至少和Dataset[_]
一般情况一样多,但可以提供更多。而事实正是如此。此外,保持向后兼容性是“一种特殊情况”,特别是当“强类型”变体比专门的
DataFrame
操作更不受欢迎并且通常效率更低时。
推荐阅读
- javascript - 无法返回 Fetch API 接收到的数据
- authentication - Keycloak 是否像 Auth0 一样提供嵌入式登录?
- postgresql - 创建错误的点值
- python - 如何制作 Python 脚本以获得回报?
- java - Java:使静态类(不是实例)符合接口
- node.js - 无法将正则表达式与文本匹配
- reactjs - 是否可以使用 Algolia 和 Instant-Search 对两个不同的 UI 进行 A/B 测试?
- php - PHP:访问在一个函数中声明的变量,在另一个函数中
- javascript - 在 JQuery 中向 .text() 方法添加换行符?
- reactjs - 如何覆盖 react-hooks 组件内的函数测试 - Enzyme/Jest