Spark RDD---api(map&reduce)

RDD簡介
RDD是spark中的抽象數據結構,任何數據在Spark中都被表示爲RDD。RDD可被看成一個數組,但RDD中的數據是可以分區存儲的,能夠分佈在不同的機器上。
Spark應用程序就是把需要處理的數據轉化爲RDD,然後進行一系列的transforms(轉換)action(操作/執行),從而得到結果
RDD的創建
1、將數組轉化爲RDD
val a = sc.parallelize(1 to 9)  //可以用(1 to 9, 3)設置三個分區
a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD
a.collect
Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
2、從文件系統中的文件創建RDD(我這裏用的是HDFS)
val a = sc.textFile("sparkApp/wordcount/input/score.txt")
a: org.apache.spark.rdd.RDD[String] = sparkApp/wordcount/input/score.txt MapPartitionsRDD
a.collect
Array[String] = Array(aa 78, bb 98, aa 80, cc 98, aa 69, cc 87, bb 97, cc 86, aa 97, bb 78, bb 34, cc 85, bb 92, cc 72, bb 33, bb 23)
map
map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。

val a = sc.parallelize(1 to 9)
val b = a.map(x => x * x)
b: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD
b.collect
Array[Int] = Array(1, 4, 9, 16, 25, 36, 49, 64, 81)
該實例將原RDD中的每一個元素進行平方來產生對應的新RDD
mapValues
輸入函數應用於RDD中Kev-ValueValue,原RDD中的Key保持不變,與新的Value一起組成新的RDD中的元素。
因此,該函數只適用於元素爲KV對的RDD。
val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", "eagle"))
val b = a.map(x => (x.length, x))
val c = b.mapValues("-----" + _ + "-----")
c.collect
Array[(Int, String)] = Array((3,-----dog-----), (5,-----tiger-----), (4,-----lion-----), (3,-----cat-----), (7,-----panther-----), (5,-----eagle-----))
flatMap
map類似,區別是原RDD中的元素經map處理後只能生成一個元素,而原RDD中的元素經flatmap處理後可生成多個元素來構建新RDD。(下面進行比較)
val a = sc.parallelize(1 to 4)

a.map(x => 1 to x).collect
Array[scala.collection.immutable.Range.Inclusive] = Array(Range(1), Range(1, 2), Range(1, 2, 3), Range(1, 2, 3, 4))

a.flatMap(x => 1 to x).collect
Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)
flatMapValues
flatMapValues類似於mapValues,不同的在於flatMapValues應用於元素爲KV對的RDD中Value。
每個一元素的Value被輸入函數映射爲一系列的值,然後這些值再與原RDD中的Key組成一系列新的KV對。
val a = sc.parallelize(Array((1,2),(3,4),(5,6)))
val b = a.flatMapValues(x => x to 7)
b.collect
Array[(Int, Int)] = Array((1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (3,4), (3,5), (3,6), (3,7), (5,6), (5,7))
reduce
reduce將RDD中元素兩兩傳遞給輸入函數,同時產生一個新的值,新產生的值與RDD中下一個元素再被傳遞給輸入函數直到最後只有一個值爲止。
val a = sc.parallelize(1 to 10)
a.reduce((x, y) => x * y)
Int = 3628800
以上爲從1乘到10
reduceByKey
顧名思義,reduceByKey就是對元素爲KV對的RDD中Key相同的元素的Value進行reduce.
因此,Key相同的多個元素的值被reduce爲一個值,然後與原RDD中的Key組成一個新的KV對。
val a = sc.parallelize(Array(("asd", 1),("bv", 1),("asd", 1)))
a.reduceByKey((x,y) => x + y).collect
Array[(String, Int)] = Array((asd,2), (bv,1))
以上key爲"asd"的value值相加,與"asd"組成新的kv對。

更多API

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