我仍在努力了解最近推出的 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 Catalyst和 Tungsten 。它包括逻辑和物理计划优化、矢量化操作和低级内存管理。
您失去的是灵 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/