23 - Spark -mapPartitions算子

RDD的轉換

RDD整體上分爲Value類型和Key-Value類型

flatMap(func) 案例

  1. 作用:類似於map,但獨立地在RDD的每一個分片上運行,因此在類型爲T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]。假設有N個元素,有M個分區,那麼map的函數的將被調用N次,而mapPartitions被調用M次,一個函數一次處理所有分區。
  2. 需求:創建一個RDD,使每個元素*2組成新的RDD
  3. 分區執行
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Spark23 extends App {
  // 設定Spark計算環境
  val config: SparkConf = new SparkConf().setMaster("local[1]").setAppName("WordCount")

  // 創建上下文
  val sc = new SparkContext(config)

  private val listRDD: RDD[Int] = sc.makeRDD(1 to 10)

  private val mapPartitionsRDD: RDD[Int] = listRDD.mapPartitions( datas => datas.map(
    datas => datas * 2
  ))

  mapPartitionsRDD.collect().foreach(println)
}
2
4
6
8
10
12
14
16
18
20

map()和mapPartition()的區別

  1. map():每次處理一條數據。
  2. mapPartition():每次處理一個分區的數據,這個分區的數據處理完後,原RDD中分區的數據才能釋放,可能導致OOM。
  3. 開發指導:當內存空間較大的時候建議使用mapPartition(),以提高處理效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章