为什么有不同的RDD以及它们各自的用途是什么?

时间:2016-06-03 13:02:56

标签: scala apache-spark

Spark中有很多RDD;来自docs

  • AsyncRDDActions
  • CoGroupedRDD
  • DoubleRDDFunctions
  • HadoopRDD
  • JdbcRDD
  • NewHadoopRDD
  • OrderedRDDFunctions
  • PairRDDFunctions
  • PartitionPruningRDD
  • RDD
  • SequenceFileRDDFunctions
  • ShuffledRDD
  • UnionRDD

我不明白他们应该是什么。

另外我注意到有

  • ParallelCollectionRDD
  • MapPartitionsRDD

虽然它们经常出现在我的spark-shell中作为对象,但未列出。

问题

为什么有不同的RDD以及它们各自的目的是什么?

到目前为止我所理解的

我从教程和书籍(例如" Learning Spark")中了解到,RDD上有两种类型的操作:具有成对(x, y)的RDD和所有其他操作。所以我希望上课RDDPairRDD就可以了。

我怀疑

我怀疑我得到了部分错误,实际情况是,许多RDD类只能是一个RDD类 - 但这会使事情变得不那么整洁。因此,开发人员决定将不同的方法放入不同的类中,为了将这些方法提供给任何RDD类类型,他们使用implicit来强制类类型。我怀疑,由于许多RDD类类型以"函数"结束。或"行动"各个scaladocs中的文字听起来像这样。

此外,我怀疑某些RDD类仍然不是那样,但有一些更深入的含义(例如ShuffledRDD)。

但是 - 我不确定这一点。

1 个答案:

答案 0 :(得分:2)

首先,大约一半列出的类不扩展RDD,但是类型类旨在使用特定于存储类型的不同方法来扩充RDD。

一个常见示例是RDD[(T, U)],通常称为PairRDD,它由PairRDDFunctions提供的方法(例如combineByKeyWithClassTag)丰富,byKey是所有PairRDD的基本构建块。 1}}转换。如果没有PairwiseRDDRDD这样的类,这些名称纯粹是非正式的,那就毫无价值了。

还有一些常用的ParallelCollectionRDD子类,它们不是公共API的一部分,因此未在上面列出。值得一提的一些示例包括MapPartitionsRDDRDD

compute是一个抽象类,它没有实现两个重要的方法:

  • getPartitions计算给定分区的结果
  • RDD返回给定ParallelCollectionRDD
  • 的分区序列

一般来说,将RDD子类化有两个原因;

  • 创建一个代表输入源的类(例如JdbcRDDRDD
  • 创建一个提供非标准转换的RDD

所以总结

  • RDDs class为RDD提供了一个最小的界面。
  • RDDs的子类提供基于外部源和/或父RDD的实际计算所需的内部逻辑。这些是私有的或开发人员API的一部分,并且不包括调试字符串或Spark UI,不会直接暴露给最终用户。
  • 类型类根据?'['中存储的值的类型提供其他方法,而不依赖于它的创建方式。