2016-02-16 46 views
8

我还在努力理解最近推出的Spark Datasets的全部功能。Spark DataSet和RDD有什么区别

是否存在何时使用RDD以及何时使用数据集的最佳做法?

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

这只是对向下兼容性的参考,或者是否有情况下人们更喜欢使用数据集上的RDD?

+0

检查这个环节也:https://开头计算器。com/a/45253013/1592191 – mrsrinivas

回答

14

此刻(Spark 1.6.0)DataSet API只是一个预览版,只实现了一小部分功能,因此无法告诉任何有关最佳实践的内容。

概念星火DataSet只是一个DataFrame额外的类型安全(或者,如果你喜欢a glance at the futureDataFrameDataSet[Row])。这意味着你得到了所有的benefits of CatalystTungsten。它包括逻辑和物理计划优化,矢量化操作和低级内存管理。

你松动的是灵活性和透明度。

首先,您的数据必须经过编码,然后才能与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相同的灵活性(至少没有更深入地介绍Catalyst内部)。

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

参见:

+1

非常感谢您的详细解答! –