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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值