作為spark初學者對,一直對map與flatMap兩個函數比較難以理解,這幾天看了和寫了不少例子,終於把它們搞清楚了
兩者的區別主要在於action后得到的值
例子:
import org.apache.spark.{SparkConf, SparkContext} object MapAndFlatMap { def main(args: Array[String]): Unit = { val sc = new SparkContext(new SparkConf().setAppName("map_flatMap_demo").setMaster("local")) val arrayRDD =sc.parallelize(Array("a_b","c_d","e_f")) arrayRDD.foreach(println) //打印結果1 arrayRDD.map(string=>{ string.split("_") }).foreach(x=>{ println(x.mkString(",")) //打印結果2 }) arrayRDD.flatMap(string=>{ string.split("_") }).foreach(x=>{ println(x.mkString(","))//打印結果3 }) } }
上述代碼中,打印結果1、2、3分別如下面三圖
打印結果1
打印結果2
打印結果3
對比結果2與結果3,很容易得出結論:
map函數后,RDD的值為 Array(Array("a","b"),Array("c","d"),Array("e","f"))
flatMap函數處理后,RDD的值為 Array("a","b","c","d","e","f")
即最終可以認為,flatMap會將其返回的數組全部拆散,然后合成到一個數組中