我正在尝试以下示例
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
答案 0 :(得分:4)
您所看到的是 implicit conversion 的影响:
rdd
的类型为org.apache.spark.rdd.RDD[(String, Int)]
当您尝试调用aggregateByKey
并且它不适用于此类型时,编译器会查找某些类型的隐式转换,并找到this转换为{{ 1}}:
PairRDDFunctions
关于你的上一个问题:
什么是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的哪个子类型。