Spark中有很多RDD;来自docs:
我不明白他们应该是什么。
另外我注意到有
ParallelCollectionRDD
MapPartitionsRDD
虽然它们经常出现在我的spark-shell中作为对象,但未列出。
为什么有不同的RDD以及它们各自的目的是什么?
我从教程和书籍(例如" Learning Spark")中了解到,RDD上有两种类型的操作:具有成对(x, y)
的RDD和所有其他操作。所以我希望上课RDD
和PairRDD
就可以了。
我怀疑我得到了部分错误,实际情况是,许多RDD类只能是一个RDD类 - 但这会使事情变得不那么整洁。因此,开发人员决定将不同的方法放入不同的类中,为了将这些方法提供给任何RDD类类型,他们使用implicit
来强制类类型。我怀疑,由于许多RDD类类型以"函数"结束。或"行动"各个scaladocs中的文字听起来像这样。
此外,我怀疑某些RDD类仍然不是那样,但有一些更深入的含义(例如ShuffledRDD
)。
但是 - 我不确定这一点。
答案 0 :(得分:2)
首先,大约一半列出的类不扩展RDD,但是类型类旨在使用特定于存储类型的不同方法来扩充RDD。
一个常见示例是RDD[(T, U)]
,通常称为PairRDD
,它由PairRDDFunctions
提供的方法(例如combineByKeyWithClassTag
)丰富,byKey
是所有PairRDD
的基本构建块。 1}}转换。如果没有PairwiseRDD
或RDD
这样的类,这些名称纯粹是非正式的,那就毫无价值了。
还有一些常用的ParallelCollectionRDD
子类,它们不是公共API的一部分,因此未在上面列出。值得一提的一些示例包括MapPartitionsRDD
和RDD
。
compute
是一个抽象类,它没有实现两个重要的方法:
getPartitions
计算给定分区的结果RDD
返回给定ParallelCollectionRDD
一般来说,将RDD子类化有两个原因;
JdbcRDD
,RDD
)RDD
所以总结:
RDDs
class为RDD
提供了一个最小的界面。RDDs
的子类提供基于外部源和/或父RDD
的实际计算所需的内部逻辑。这些是私有的或开发人员API的一部分,并且不包括调试字符串或Spark UI,不会直接暴露给最终用户。?'['
中存储的值的类型提供其他方法,而不依赖于它的创建方式。