RDD編程之RDD的創建

在Spark中創建RDD的創建方式可以分爲三種:從集合中創建RDD;從外部存儲創建RDD;從其他RDD創建。
創建RDD之前要先創建spark上下文對象:

val conf = new SparkConf().setMaster("local").setAppName("WorldCount")
val sc = new SparkContent(conf)

(1)從內存中創建
①使用parallelize()從集合創建

val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8))

②使用makeRDD()從集合創建

val rdd = sc.makeRDD(Array(1,2,3,4,5,6,7,8))

再看看他們的底層源碼:
在這裏插入圖片描述
在這裏插入圖片描述
可以看到它們底層源碼都是兩個參數,那爲什麼上面只傳一個參數也行呢?另一個參數有什麼用呢?其實它們的第二個參數都是設定分區數的,因爲RDD是可分區的,在創建RDD的時候可以傳入參數讓RDD固定分多少個區。但是如果你不傳的話也有默認值,如果不寫就用默認的參數。先來看makeRDD()的默認值,最底層的源碼如下:

override def defaultParallelism(): Int = {
    conf.getInt("spark.default.parallelism", math.max(totalCoreCount.get(), 2))
  }

它的分區數首選在spark中配置的spark.default.parallelism參數,由於我用的是maven倉庫,所以沒有默認值,所以它會用後面的代碼,在totalCoreCount.get()和2之間選出最大的。那麼totalCoreCount.get又是什麼呢?這就涉及到創建spark上下文對象時候設定的,默認是值本機cpu核數。parallelize()的和makeRDD是一樣的。
(2)從磁盤中創建

val lines: RDD[String] = sc.textFile("C:\\Users\\ASUS\\IdeaProjects\\Spark\\src\\main\\resources\\input.txt")

從磁盤中創建RDD就是讀取磁盤的數據然後創建RDD,這個方法也可以在textFile()中指定RDD的分區數,其創建RDD的源碼如下:

/**
   * Read a text file from HDFS, a local file system (available on all nodes), or any
   * Hadoop-supported file system URI, and return it as an RDD of Strings.
   */
  def textFile(
      path: String,
      minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
    assertNotStopped()
    hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
      minPartitions).map(pair => pair._2.toString).setName(path)
  }

可以看到,它是在defaultParallelism和2之間取最小的,defaultParallelism和上面的在內存中創建那個值是一樣的,我這裏也是cpu核數,所以默認會分成兩個RDD。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章