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

问题描述 投票:0回答:1

我正在尝试以下示例

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

scala shell apache-spark rdd apache-spark-1.6
1个回答
4
投票

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

  • rdd确实有org.apache.spark.rdd.RDD[(String, Int)]类型
  • 当你尝试调用aggregateByKey并且它不适用于这种类型时,编译器会查找某些类型的隐式转换 - 并找到this转换为PairRDDFunctionsimplicit 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) }
  • 然后,调用PairRDDFunctions.aggregateByKey

至于你的上一个问题:

什么是ParallelCollectionRDD

RDD是一个包含许多子类的抽象类,这是其中之一。一般而言,每个子类负责对RDD执行的不同操作,例如,读取/写入/改组/检查点等。调用SparkContext.parallelize时使用此特定类型 - 意味着,它用于并行化驱动程序中的集合。实际上,它是私有的,你通常不应该关心你实际拥有的RDD的哪个子类型。

© www.soinside.com 2019 - 2024. All rights reserved.