RDD的轉換
RDD整體上分爲Value類型和Key-Value類型
flatMap(func) 案例
- 作用:類似於map,但獨立地在RDD的每一個分片上運行,因此在類型爲T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]。假設有N個元素,有M個分區,那麼map的函數的將被調用N次,而mapPartitions被調用M次,一個函數一次處理所有分區。
- 需求:創建一個RDD,使每個元素*2組成新的RDD
- 分區執行
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object Spark23 extends App {
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()的區別
- map():每次處理一條數據。
- mapPartition():每次處理一個分區的數據,這個分區的數據處理完後,原RDD中分區的數據才能釋放,可能導致OOM。
- 開發指導:當內存空間較大的時候建議使用mapPartition(),以提高處理效率。