mapPartition與map函數

dd的mapPartitions是map的一個變種,它們都可進行分區的並行處理。
兩者的主要區別是調用的粒度不一樣:map的輸入變換函數是應用於RDD中每個元素,而mapPartitions的輸入函數是應用於每個分區。
Map 算子是分區內一個數據一個數據的執行,類似於串行操作。而 mapPartitions 算子是以分區爲單位進行批處理操作。
假設一個rdd有10個元素,分成3個分區。如果使用map方法,map中的輸入函數會被調用10次;而使用mapPartitions方法的話,其輸入函數會只會被調用3次,每個分區調用1次。
從功能上講:Map 算子主要目的將數據源中的數據進行轉換和改變。但是不會減少或增多數據。MapPartitions 算子需要傳遞一個迭代器,返回一個迭代器,沒有要求的元素的個數保持不變,所以可以增加或減少數據。

從性能上講:Map 算子因爲類似於串行操作,所以性能比較低,而是 mapPartitions 算子類似於批處理,所以性能較高。但是 mapPartitions算子會長時間佔用內存,那麼這樣會導致內存可能不夠用,出現內存溢出的錯誤。所以在內存有限的情況下,不推薦使用。使用 map 操作。

 

例:可以求每個分區的最大值,亦或是在連接數據庫操作時,可以以爲分區單位進行操作

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("mapPartitions1")
    val sc = new SparkContext(conf)
    val file: RDD[Int] =sc.makeRDD(List(1,2,9,11,3,9,4,22,11),2)

    val result: RDD[Int] = file.mapPartitions(s => {

      Array(s.max).iterator

    })
    result.foreach(println)
    sc.stop()

 

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