我仍然在努力了解最近推出的Spark数据集的全部功能。
是否有何时使用RDD以及何时使用数据集的最佳做法?
在他们的announcement Databricks中解释说,通过使用数据集,可以实现运行时和内存的惊人减少。尽管如此,据称数据集的设计与现有的RDD API一起工作。''
这仅仅是向下兼容性的参考,还是有人希望在数据集上使用RDD?
答案 0 :(得分:14)
目前(Spark 1.6.0)DataSet
API只是一个预览版,只实现了一小部分功能,因此无法说明最佳实践。
从概念上讲,Spark DataSet
只是DataFrame
,具有额外的类型安全性(或者,如果您愿意,a glance at the future DataFrame
是DataSet[Row]
)。这意味着您获得了所有benefits of Catalyst和Tungsten。它包括逻辑和物理计划优化,矢量化操作和低级内存管理。
你失去的是灵活性和透明度。
首先,您的数据必须先进行编码才能与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 :(得分:0)
数据集 1)这是Spark提供的结构化API,用于处理类似表格的结构。 就像在任何数据库上的表一样,可以在其中进行分析或数据操作。 2)它是DataFrame的子集。如果您点击链接,您将获得DataSet支持的许多功能或方法 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)只要业务需求特别大,并且您当时无法在DataFrame或DataSet上执行操作,则可以使用RDD。 5)您需要执行一些自定义共享变量操作