Spark 中的数据框和数据集
Dataframes and Datasets in Spark
我是 Spark 的新手,正在研究数据帧和数据集。我试图了解它们之间的区别,但我很困惑。
我开始here,发现RDD的抽象是按照下面的顺序发生的
RDD (Spark1.0) —> 数据框(Spark1.3) —> 数据集(Spark1.6)
Q.1 在 link here 上,它说 Dataframe 是 [=47 的别名=]Dataset[Row] 即 Dataset 类型 Row。如果 Dataframe 是首先完成的 RDD 的抽象,这是否意味着 Dataset 已经存在于 Spark1.3 或 Spark1.6 开发时 Dataframe 被重新定义为 Dataset[Row ]?
Q.2 在 link here 上,它说,
"A Dataset is a strongly typed collection of domain-specific objects that can be transformed in parallel using functional or relational operations. Each Dataset also has an untyped view called a DataFrame, which is a Dataset of Row."
如果,Dataframe实际上是Dataset[Row] 为什么Dataframe被称为untyped?这里的type不应该是Row [defined here]吗?
Q.3另外如果Dataframe是Dataset[Row],那么为什么定义Dataframe 分开?此外,Dataset 的每个操作也应该可以在 Dataframe 上调用。如果以上陈述不正确或部分正确,请随时回答。
如果觉得这些问题太宽泛,请告诉我。我会根据需要进行编辑。
简而言之,外部 API 的连续性(来自 Shark,现已删除,通过 SchemaRDD
和 DataFrame
到 Dataset[Row]
)没有表示内部连续性。内部 API 经历了重大变化,当前的实施甚至不像最初的 Spark SQL 尝试。
1.3中没有Dataset
,2.0之前DataFrame
也没有和Dataset
统一。
这不是精确的描述(与 "strong typing" 的高度非正式用法相同)。它指的是两个事实:
Row
是 Any
的容器(类似集合),因此无法进行有意义的 static 打字。这并不意味着它是 "untyped"(Any
是类型层次结构的有效元素),但它只是不向编译器提供有用的信息。
在 DataFrame
DSL 级别缺少类型检查,这与另一点相同是相当误导的,因为它完全保留了类型系统约束。
所以从根本上说,它 "untyped" 相对于一些理想主义的、不存在的系统,在该系统中,编译器会保护所有可能的运行时故障。在更现实的场景中,它区分了选择的实现和无框架等面向类型的变体,这反过来又受到 JVM 作为平台的一些实际限制的影响(是的,我说的是你,广泛的数据)。
Also if Dataframe is Dataset[Row], then why define Dataframe separately? Also every operation of Dataset should also be callable on Dataframe.
没错,但这并不意味着相反。 Dataset[Row]
是 Dataset
的一个特定案例 - 它必须至少提供与 Dataset[_]
一样多的一般情况,但可以提供更多。而事实就是如此。
此外,"a special case" 是为了保持向后兼容性,尤其是当 "strongly typed" 变体比专门的 DataFrame
操作更不流行且通常效率较低时。
我是 Spark 的新手,正在研究数据帧和数据集。我试图了解它们之间的区别,但我很困惑。
我开始here,发现RDD的抽象是按照下面的顺序发生的
RDD (Spark1.0) —> 数据框(Spark1.3) —> 数据集(Spark1.6)
Q.1 在 link here 上,它说 Dataframe 是 [=47 的别名=]Dataset[Row] 即 Dataset 类型 Row。如果 Dataframe 是首先完成的 RDD 的抽象,这是否意味着 Dataset 已经存在于 Spark1.3 或 Spark1.6 开发时 Dataframe 被重新定义为 Dataset[Row ]?
Q.2 在 link here 上,它说,
"A Dataset is a strongly typed collection of domain-specific objects that can be transformed in parallel using functional or relational operations. Each Dataset also has an untyped view called a DataFrame, which is a Dataset of Row."
如果,Dataframe实际上是Dataset[Row] 为什么Dataframe被称为untyped?这里的type不应该是Row [defined here]吗?
Q.3另外如果Dataframe是Dataset[Row],那么为什么定义Dataframe 分开?此外,Dataset 的每个操作也应该可以在 Dataframe 上调用。如果以上陈述不正确或部分正确,请随时回答。
如果觉得这些问题太宽泛,请告诉我。我会根据需要进行编辑。
简而言之,外部 API 的连续性(来自 Shark,现已删除,通过
SchemaRDD
和DataFrame
到Dataset[Row]
)没有表示内部连续性。内部 API 经历了重大变化,当前的实施甚至不像最初的 Spark SQL 尝试。1.3中没有
Dataset
,2.0之前DataFrame
也没有和Dataset
统一。这不是精确的描述(与 "strong typing" 的高度非正式用法相同)。它指的是两个事实:
Row
是Any
的容器(类似集合),因此无法进行有意义的 static 打字。这并不意味着它是 "untyped"(Any
是类型层次结构的有效元素),但它只是不向编译器提供有用的信息。在
DataFrame
DSL 级别缺少类型检查,这与另一点相同是相当误导的,因为它完全保留了类型系统约束。
所以从根本上说,它 "untyped" 相对于一些理想主义的、不存在的系统,在该系统中,编译器会保护所有可能的运行时故障。在更现实的场景中,它区分了选择的实现和无框架等面向类型的变体,这反过来又受到 JVM 作为平台的一些实际限制的影响(是的,我说的是你,广泛的数据)。
Also if Dataframe is Dataset[Row], then why define Dataframe separately? Also every operation of Dataset should also be callable on Dataframe.
没错,但这并不意味着相反。
Dataset[Row]
是Dataset
的一个特定案例 - 它必须至少提供与Dataset[_]
一样多的一般情况,但可以提供更多。而事实就是如此。此外,"a special case" 是为了保持向后兼容性,尤其是当 "strongly typed" 变体比专门的
DataFrame
操作更不流行且通常效率较低时。