Spark DataSet和RDD有什么区别?

10
我仍在努力理解最近推出的 Spark Datasets 的完整功能。
何时使用 RDD 和何时使用 Datasets 是否存在最佳实践?
在他们的声明中,Databricks 解释说,通过使用 Datasets 可以实现惊人的运行时和内存减少。但仍然声称,Datasets 被设计为“与现有的 RDD API 一起工作”。
这只是对向下兼容性的引用,还是存在优先使用 RDD 而不是 Datasets 的情况?

请查看此链接:https://dev59.com/5VwZ5IYBdhLWcg3wYvgk#45253013 - mrsrinivas
2个回答

15

目前(Spark 1.6.0),DataSet API只是一个预览版,只实现了一小部分功能,因此无法提供最佳实践建议。

从概念上讲,Spark DataSet 只是带有额外类型安全性的DataFrame(如果您愿意,参考未来的一瞥DataFrame 是一个 DataSet [Row] )。这意味着您可以获得Catalyst和Tungsten的所有优点Tungsten。它包括逻辑和物理计划优化、向量操作和底层内存管理。

您失去的是灵活性和透明度。

首先,您的数据必须在使用 DataSet 之前进行编码。Spark为原始类型和产品/案例类提供编码器,目前所需的API未提供自定义序列化的定义。最有可能与UDT API(例如如何为Spark SQL中的自定义类型定义模式?为Spark SQL DataFrame序列化/反序列化现有类)相对类似,这些问题都会存在。它比较冗长,需要额外的工作,并且在处理复杂对象时可能变得不明显。此外,它涉及到一些API的低级方面,这些方面文档不是很好。

关于透明度,这与典型RDBMS中的计划程序几乎是相同的问题。 它很棒,直到它不再是。它是一个惊人的工具,可以分析您的数据,进行智能转换,但与任何工具一样,它可能走错路线并导致需要查看执行计划并尝试弄清楚如何使其工作。

根据预览,我认为它可以放置在DataFrame API和RDD API之间。 它比DataFrames更灵活,但仍提供类似的优化,并且非常适合一般的数据处理任务。 它没有提供与RDD API相同的灵活性(至少没有深入研究Catalyst内部)。

另一个差异(目前只是假设)是它与客户语言(R,Python)交互的方式。 与DataFrame类似,DataSet属于JVM。这意味着任何可能的互动都可以属于两个类别之一:本地JVM操作(例如DataFrame表达式)和客户端代码(例如Python UDF)。 不幸的是,第二部分需要在JVM和客户端环境之间进行昂贵的来回传输。

另请参见:


0

DataSet 1) DataSet是由Spark提供的结构化API,可用于类似表格的结构上进行分析或数据操作,就像在任何数据库中的表格一样。 2) 它是DataFrame的子集。如果您查看链接,您将了解到支持DataSet的许多函数或方法。 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset 3) 它是一个高级API。

RDD 1) RDD(弹性分布式数据集)是核心级别的Spark API。 2) 当您处理任何DataFrame或DataSets时,它们都会转换为低级API即RDD。 3) 这些在业务需求异常且无法对DataFrame或DataSets执行操作时非常有用,此时可以使用RDD。 4) 您需要进行一些自定义共享变量操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接