Spark DataSet 和 RDD 有什么区别

What is the difference between Spark DataSet and RDD

我仍在努力理解最近推出的 Spark 数据集的全部功能。

是否有关于何时使用 RDD 以及何时使用数据集的最佳实践?

Databricks 在他们的 announcement 中解释说,通过使用数据集,可以实现运行时间和内存的惊人减少。仍然声称数据集被设计为“'to work alongside the existing RDD API'”。

这只是向下兼容性的参考,还是在某些情况下人们更愿意使用 RDD 而不是数据集?

目前(Spark 1.6.0)DataSet API 只是一个预览版,只实现了一小部分功能,因此无法提供任何有关最佳实践的信息。

从概念上讲,Spark DataSet 只是具有额外类型安全性的 DataFrame(或者如果您更喜欢 a glance at the future DataFrame is a DataSet[Row]). It means you get all the benefits of Catalyst and Tungsten。它包括逻辑和物理计划优化、矢量化操作和低级内存管理.

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

首先,您的数据必须经过编码才能与 DataSet 一起使用。 Spark 为原始类型和产品/案例 类 提供编码器,目前 API 定义自定义序列化所需的编码器不可用。它很可能与 UDT API(参见示例 , Serialize/Deserialize existing class for spark sql dataframe)及其所有问题相对相似。它相对冗长,需要额外的努力,并且对于复杂的对象可能变得很不明显。此外,它涉及 API 的一些较低级别的方面,这些方面没有很好的记录。

关于透明度,这与典型 RDBMS 中的规划器几乎是相同的问题。它很棒,直到它不是。这是一个了不起的工具,它可以分析您的数据,进行智能转换,但作为任何工具,它都可能走错路,留下盯着执行计划并试图弄清楚如何让事情发挥作用。

根据预览,我会说它可以放在 DataFrame API 和 RDD API 之间的某个位置。它比 DataFrames 更灵活,但仍提供类似的优化,非常适合一般数据处理任务。它不提供与 RDD API.

相同的灵活性(至少没有深入研究 Catalyst 内部结构)

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

另请参阅:

  • Difference between DataSet API and DataFrame

数据集 1) 它是由 Spark 提供的结构化 API 来处理 Table 类结构。 您可以在其中进行分析或数据操作,就像任何数据库上的 Table 一样。 2) 它是 DataFrame 的一个子集。如果您检查 link ,您将看到该数据集支持的许多函数或方法 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset 3) 是高等级API

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