我是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上可调用。如果以上陈述不正确或有些正确,请随时回答。
如果您对这些问题有广泛的看法,请告诉我。我将根据需要对其进行编辑。
答案 0 :(得分: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
操作相比,它不那么受欢迎,并且通常效率较低。