apache-spark - Spark DataSet 和 RDD 有什么区别

标签 apache-spark rdd apache-spark-dataset

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

是否有何时使用 RDD 和何时使用数据集的最佳实践?

在他们的announcement中Databricks 解释说,通过使用数据集,可以实现运行时间和内存的惊人减少。尽管如此,据称数据集的设计目的是“与现有的 RDD API 一起工作”。

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

最佳答案

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

从概念上讲,Spark DataSet 只是一个具有额外类型安全性的 DataFrame (或者如果您更喜欢 a glance at the future DataFrame 是一个 DataSet [行])。这意味着您获得了所有 benefits of CatalystTungsten 。它包括逻辑和物理计划优化、矢量化操作和低级内存管理。

您失去的是灵 active 和透明度。

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

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

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

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

另请参阅:

关于apache-spark - Spark DataSet 和 RDD 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35424854/

相关文章:

apache-spark - 将 SSD 用于 SPARK RDD

java - 加入Spark RDD后排序乱序

apache-spark - Apache Spark RDD sortByKey 算法和时间复杂度

scala - 将数据框中的字符串数据转换为 double

scala - 字符串RDD连接操作

java - 使用 Spark 的 MapReduce 调用不同的函数并聚合

apache-spark - Spark DataFrame RangePartitioner

apache-spark - Spark 数据集 - 内部连接问题

java - 尝试使用 Spark 数据集 (Java) 查找 2 个文件之间删除的记录时结果不一致

json - GsonBigQueryInputFormat将整数保存为字符串