在与spark-shell
一起工作时,我注意到了一些有趣的事情,并且很好奇为什么会这样。我使用基本语法将文本文件加载到Spark中,然后只需重复此命令即可。 REPL的输出如下:
scala> val myreviews = sc.textFile("Reviews.csv")
myreviews: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[1] at textFile at <console>:24
scala> val myreviews = sc.textFile("Reviews.csv")
myreviews: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[3] at textFile at <console>:24
scala> val myreviews = sc.textFile("Reviews.csv")
myreviews: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[5] at textFile at <console>:24
scala> val myreviews = sc.textFile("Reviews.csv")
myreviews: org.apache.spark.rdd.RDD[String] = Reviews.csv MapPartitionsRDD[7] at textFile at <console>:24
我知道MapPartitionsRDD[X]
部分具有X
作为RDD标识符。但是,基于此SO post on RDD identifiers,我希望每次创建新的RDD时,标识符整数都会增加1。那么为什么要增加2?
我的猜测是,加载文本文件会创建中间RDD?因为从parallelize()
清楚地创建RDD只会使RDD计数器增加1(之前为7):
scala> val arrayrdd = sc.parallelize(Array(3,4,5))
arrayrdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[8] at parallelize at <console>:24
注意:我不认为该数字与分区有关。如果我打电话,我将我的RDD分为9个分区:
scala> myreviews.partitions.size
res2: Int = 9
答案 0 :(得分:1)
因为单个方法调用可以创建多个中间RDD
。如果您检查调试字符串,将会很明显
sc.textFile("README.md").toDebugString
String =
(2) README.md MapPartitionsRDD[1] at textFile at <console>:25 []
| README.md HadoopRDD[0] at textFile at <console>:25 []
如您所见,谱系由两个RDD组成。
第一个是HadoopRDD
,它对应于data import
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
minPartitions)
第二个是MapPartitionsRDD
,与the subsequent map
相对应,后者会丢弃键(偏移量)并将Text
转换为String
。
.map(pair => pair._2.toString).setName(path)