spark學習進度06(RDD的Map運算元、FlatMap運算元、ReduceByKey運算元)
一、Map運算元:
作用
把 RDD 中的資料 一對一 的轉為另一種形式
呼叫
def map[U: ClassTag](f: T ⇒ U): RDD[U]
引數
f
→ Map 運算元是原RDD → 新RDD
的過程, 這個函式的引數是原 RDD 資料, 返回值是經過函式轉換的新 RDD 的資料
注意點
Map 是一對一, 如果函式是String → Array[String]
則新的 RDD 中每條資料就是一個數組
@Test def mapTest():Unit={ //先建立一個RDD val rdd1 = sc.parallelize(Seq(1,2,3))//執行map val rdd2 = rdd1.map(item => item*10) //得到結果 val result = rdd2.collect() //結果輸出 result.foreach(item => println(item)) }
二、FlatMap運算元:
作用
FlatMap 運算元和 Map 運算元類似, 但是 FlatMap 是一對多
呼叫
def flatMap[U: ClassTag](f: T ⇒ List[U]): RDD[U]
引數
f
→ 引數是原 RDD 資料, 返回值是經過函式轉換的新 RDD 的資料, 需要注意的是返回值是一個集合, 集合中的資料會被展平後再放入新的 RDD
注意點
flatMap 其實是兩個操作, 是map + flatten
, 也就是先轉換, 後把轉換而來的 List 展開
//flatmap運算元 @Test def flatMapTest():Unit={ //建立RDD val rdd1 = sc.parallelize(Seq("Hello lilty","hello wen","lilty Hello")) //處理資料 val rdd2 = rdd1.flatMap(item => item.split(" ")) //得到結果 val result=rdd2.collect()//列印 result.foreach(item => println(item)) //關閉sc sc.stop() }
flatMap也是轉換,他可以把陣列和集合展開,並且flatMap中的函式一般也是集合或者陣列
三、ReduceByKey運算元:
作用
首先按照 Key 分組, 接下來把整組的 Value 計算出一個聚合值, 這個操作非常類似於 MapReduce 中的 Reduce
呼叫
def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]
引數
func → 執行資料處理的函式, 傳入兩個引數, 一個是當前值, 一個是區域性彙總, 這個函式需要有一個輸出, 輸出就是這個 Key 的彙總結果
注意點
-
ReduceByKey 只能作用於 Key-Value 型資料, Key-Value 型資料在當前語境中特指 Tuple2
-
ReduceByKey 是一個需要 Shuffled 的操作
-
和其它的 Shuffled 相比, ReduceByKey是高效的, 因為類似 MapReduce 的, 在 Map 端有一個 Cominer, 這樣 I/O 的資料便會減少
//reduceByKey運算元 @Test def reduceByKeyTest():Unit={ //建立RDD val rdd1 = sc.parallelize(Seq("Hello lilty","hello wen","lilty Hello")) //處理資料 val rdd2 = rdd1.flatMap(item => item.split(" ")).map(item => (item,1)).reduceByKey((curr,agg)=>curr+agg) //得到結果 val result=rdd2.collect() //列印 result.foreach(item => println(item)) //關閉sc sc.stop() }
reduceByKey第一步是按照Key進行分組,然後對每一組進行聚合得到結果