天天看点

Spark RDD---api(map&reduce)

RDD简介
RDD是spark中的抽象数据结构,任何数据在Spark中都被表示为RDD。RDD可被看成一个数组,但RDD中的数据是可以分区存储的,能够分布在不同的机器上。
Spark应用程序就是把需要处理的数据转化为RDD,然后进行一系列的transforms(转换)和action(操作/执行),从而得到结果
           
RDD的创建
、将数组转化为RDD
val a = sc.parallelize( to )  //可以用( to , )设置三个分区
a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD
a.collect
Array[Int] = Array(, , , , , , , , )
           
、从文件系统中的文件创建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 , bb , aa , cc , aa , cc , bb , cc , aa , bb , bb , cc , bb , cc , bb , bb )
           
map
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。

val a = sc.parallelize( to )
val b = a.map(x => x * x)
b: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD
b.collect
Array[Int] = Array(, , , , , , , , )
该实例将原RDD中的每一个元素进行平方来产生对应的新RDD
           
mapValues
输入函数应用于RDD中Kev-Value的Value,原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((,-----dog-----), (,-----tiger-----), (,-----lion-----), (,-----cat-----), (,-----panther-----), (,-----eagle-----))
           
flatMap
与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。(下面进行比较)
val a = sc.parallelize( to )

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

a.flatMap(x =>  to x).collect
Array[Int] = Array(, , , , , , , , , )
           
flatMapValues
flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。
每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。
val a = sc.parallelize(Array((,),(,),(,)))
val b = a.flatMapValues(x => x to )
b.collect
Array[(Int, Int)] = Array((,), (,), (,), (,), (,), (,), (,), (,), (,), (,), (,), (,))
           
reduce
reduce将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。
val a = sc.parallelize( to )
a.reduce((x, y) => x * y)
Int = 
以上为从乘到
           
reduceByKey
顾名思义,reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行reduce.
因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
val a = sc.parallelize(Array(("asd", ),("bv", ),("asd", )))
a.reduceByKey((x,y) => x + y).collect
Array[(String, Int)] = Array((asd,), (bv,))
以上key为"asd"的value值相加,与"asd"组成新的kv对。

           

更多API

继续阅读