我仍在努力理解最近推出的 Spark 数据集的全部功能。
是否有关于何时使用 RDD 和何时使用数据集的最佳实践?
Databricks在他们的公告中解释说,通过使用数据集,可以实现运行时和内存的惊人减少。仍然有人声称数据集被设计为“与现有的 RDD API 一起工作”。
这只是对向下兼容性的引用,还是在某些情况下人们更愿意使用 RDD 而不是数据集?
我仍在努力理解最近推出的 Spark 数据集的全部功能。
是否有关于何时使用 RDD 和何时使用数据集的最佳实践?
Databricks在他们的公告中解释说,通过使用数据集,可以实现运行时和内存的惊人减少。仍然有人声称数据集被设计为“与现有的 RDD API 一起工作”。
这只是对向下兼容性的引用,还是在某些情况下人们更愿意使用 RDD 而不是数据集?
目前(Spark 1.6.0)DataSet
API 只是一个预览版,只实现了一小部分功能,因此无法说明最佳实践。
从概念上讲,SparkDataSet
只是 aDataFrame
具有额外的类型安全性(或者如果您更喜欢看一眼未来 DataFrame
,则 a DataSet[Row]
)。这意味着您将获得Catalyst和Tungsten的所有好处。它包括逻辑和物理计划优化、矢量化操作和低级内存管理。
你失去的是灵活性和透明度。
首先,您的数据必须先进行编码,然后才能与DataSet
. Spark 为原始类型和产品/案例类提供编码器,目前定义自定义序列化所需的 API 不可用。很可能它与 UDT API 相对相似(例如,请参阅如何在 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 和客户环境之间进行昂贵的往返。
也可以看看:
DataSet 1) 它是 Spark 提供的结构化 API,用于处理类似表的结构。您可以在其中进行分析或数据操作,就像任何数据库上的表一样。2) 它是 DataFrame 的一个子集。如果您查看链接,您将看到数据集支持的许多功能或方法 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 或 Data 集时,它们将转换为低级 API,即 RDD 4)当业务需求异常并且您无法在 DataFrame 或 DataSet 上执行操作时,这些都可以使用 RDD。5)你需要做一些自定义的共享变量操作