Spark中的数据帧和数据集

问题描述 投票:0回答:1

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

RDD(Spark1.0) - > Dataframe(Spark1.3) - >数据集(Spark1.6)

Q.1在链接here上,它表示Dataframe是Dataset [Row]的别名,即Row类型的数据集。如果Dataframe是首先完成的RDD的抽象,那么这意味着数据集已经存在于Spark1.3中,或者当开发Spark1.6时,Dataframe被重新定义为Dataset [Row]?

Q.2链接here,它说,

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

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

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

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

apache-spark apache-spark-sql apache-spark-dataset
1个回答
1
投票
  1. 外部API的简短连续性(从Shark,现在被删除,通过SchemaRDDDataFrameDataset[Row])并不意味着内部连续性。内部API经历了重大更改,当前实现甚至不像初始Spark SQL尝试。 在1.3中没有Dataset这样的东西,DataFrame也没有与Dataset统一到2.0。
  2. 这几乎不是精确的描述(与非常非正式的“强类型”用法相同)。它指的是两个事实: RowAny的容器(collection-ish),因此无法进行有意义的静态类型化。它并不意味着它是“无类型”(Any是类型层次结构的有效元素),但它根本不向编译器提供有用的信息。 在DataFrame DSL级别缺乏类型检查,与其他点相同是相当误导的,因为它完全保留了类型系统约束。 因此,从根本上说,它是相对于一些理想主义且不存在的系统而言是“无类型的”,其中编译器保护所有可能的运行时故障。在更现实的情况下,它区分选择的实现和类型导向的变体,如无框架,而这反过来又受制于JVM作为平台的一些实际限制(是的,我在谈论你,广泛的数据)。
  3. 此外,如果Dataframe是Dataset [Row],那么为什么要单独定义Dataframe?此外,数据集的每个操作也应该在Dataframe上可调用。 这是正确的,但并不意味着相反。 Dataset[Row]Dataset的特例 - 它必须提供至少与Dataset[_]一样多,但可以提供更多。事实确实如此。 此外,保持向后兼容性是“特殊情况”,特别是当“强类型”变体不太受欢迎,并且通常效率低于专门的DataFrame操作。
© www.soinside.com 2019 - 2024. All rights reserved.