Spark DataSet和RDD之间有什么区别

Chr*_*sch 9 apache-spark rdd apache-spark-dataset

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

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

在他们的公告中, Databricks解释说,通过使用数据集,可以实现运行时和内存的惊人减少.仍然声称数据集被设计为"与现有的RDD API一起工作".

这只是向下兼容性的参考,还是有人宁愿在数据集上使用RDD?

zer*_*323 14

此时(Spark 1.6.0)DataSetAPI只是一个预览版,只实现了一小部分功能,因此无法说明最佳实践.

从概念上讲,Spark DataSet只是DataFrame具有额外的类型安全性(或者如果你更喜欢对未来的展望 DataFrame是一个DataSet[Row]).这意味着您可以获得CatalystTungsten的所有好处.它包括逻辑和物理计划优化,矢量化操作和低级内存管理.

你放松的是灵活性和透明度.

首先,您的数据必须先进行编码才能使用DataSet.Spark为原始类型和产品/案例类提供编码器,现在定义自定义序列化所需的API不可用.它很可能与UDT API相似(例如,参见如何在Spark SQL中为自定义类型定义模式?,为Spark sql数据帧序列化/反序列化现有类)及其所有问题.它相对冗长,需要额外的努力,并且对于复杂的对象而言可能变得非常明显.此外,它涉及API的一些较低级别的方面,这些方面没有很好的记录.

关于透明度,它与典型的RDBMS中的规划器几乎是同一个问题.它很棒直到它不是.它是一个了不起的工具,它可以分析您的数据,进行智能转换,但作为任何工具,它可以采取错误的路径,并盯着执行计划,并试图找出如何使事情工作.

根据预览,我会说它可以放在DataFrameAPI和RDD API 之间.它比以上更灵活,DataFrames但仍然提供类似的优化,非常适合一般的数据处理任务.它作为RDD API不提供相同的灵活性(至少没有深入研究Catalyst内部).

另一个差异,就是此刻只是假设,是一种与客户语言(R,Python)交互的方式.类似DataFrame,DataSet属于JVM.这意味着任何可能的交互都可以属于以下两种类别之一:本机JVM操作(如DataFrame表达式)和客户端代码(如Python UDF).不幸的是,第二部分需要在JVM和访客环境之间进行昂贵的往返.

也可以看看: