为何在读取文本文件时Spark将RDD ID递增2而不是1?

时间:2018-11-29 17:30:29

标签: scala apache-spark rdd

在与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

1 个答案:

答案 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)