如何知道Spark使用Scala推断出哪种RDD类型

时间:2016-07-20 07:16:52

标签: scala shell apache-spark rdd apache-spark-1.6

我正在尝试以下示例

val lista = List(("a", 3), ("a", 1), ("b", 7), ("a", 5))
val rdd = sc.parallelize(lista)

然后在shell中我得到以下

rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[40] at parallelize at <console>:30

但由于某种原因,我仍然没有想到我能够执行这句话

val resAgg = rdd.aggregateByKey(new HashSet[Int])(_+_, _++_)

在shell中获取此内容

resAgg: org.apache.spark.rdd.RDD[(String, scala.collection.mutable.HashSet[Int])] = ShuffledRDD[41] at aggregateByKey at <console>:32

所以我有一些问题:

1.-名为rdd的var的真正RDD类型是什么?因为在shell中它显示的是org.apache.spark.rdd.RDD [(String,Int)]类型,但是在API上查看RDD类没有方法aggregateByKey。顺便说一句,JavaPairRDD类具有aggregateByKey方法

2.-如何验证/了解RDD的实际类型

3.- ParallelCollectionRDD出现了什么?我在github上找了它,我发现它是一个私有类,所以我猜是因为scala API上没有出现这个原因,但它是什么用的?

我使用的是Spark 1.6.2

1 个答案:

答案 0 :(得分:4)

您所看到的是 implicit conversion 的影响:

  • rdd 的类型为org.apache.spark.rdd.RDD[(String, Int)]
  • 当您尝试调用aggregateByKey并且它不适用于此类型时,编译器会查找某些类型的隐式转换,并找到this转换为{{ 1}}:

    PairRDDFunctions
  • 然后,调用PairRDDFunctions.aggregateByKey

关于你的上一个问题:

  

什么是ParallelCollectionRDD

RDD是一个包含许多子类的抽象类,这是其中之一。一般而言,每个子类负责对RDD执行的不同操作,例如,读取/写入/改组/检查点等。调用implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)]) (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null): PairRDDFunctions[K, V] = { new PairRDDFunctions(rdd) } 时使用此特定类型 - 意味着,它用于并行化驱动程序中的集合。事实上,它是私人的,你不应该普遍关心你实际掌握的RDD的哪个子类型。