全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析师(CDA)专版
2844 7
2016-01-29



CDA数据分析师学习之路(4)

附赠《Java高级篇--创建类和构造对象》视频教程


Spark RDD的转换操作举例


Spark RDD中的操作非常丰富,有80多种针对数据的操作。其中最重要的是Transformation(转换操作)和Action(执行操作)两类。其中转换操作采用了惰性策略,转换操作只生成元数据,相当于对业务逻辑的一种抽象描述,并不会真正执行,只有提交行动操作,这时候才开始从头到尾依次计算。

       最常用的转换操作有map, mapPartitions, mapValues, flatMapValues, filter等。

1. map

       针对RDD中的每个元素,经过指定的函数,转换成新的元素,进而得到新RDD

val a =sc.parallelize(1 to 9, 3)

val b = a.map(x=> x*2)

a.collect

b.collect

res10:Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

res11:Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)

       上述例子中把原RDD中每个元素都乘以2来产生一个新的RDD

       通过toDebugString方法来查看RDD间的依赖关系和转换过程

1.png

2. mapPartitions

       mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区

val a =sc.parallelize(1 to 9, 3)

defmyfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {

var res =List[(T, T)]()

var pre =iter.next

while(iter.hasNext) {

val cur =iter.next; res .::= (pre, cur) pre = cur; } res.iterator }

a.mapPartitions(myfunc).collect

res0:Array[(Int, Int)] = Array((1,2), (2,3), (4,5), (5,6) , (7,8), (8,9))

上述例子中的函数myfunc是把分区中一个元素和它的下一个元素组成一个Tuple。因为分区中最后一个元素没有下一个元素了,所以(3,4)和(6,7)不在结果中。

3. mapValues

       mapValues顾名思义就是输入函数应用于RDD中Kev-Value的Value,原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。

val a =sc.parallelize(List("dog", "tiger", "lion","cat", "panther", " eagle"), 2)

val b = a.map(x=> (x.length, x))

b.mapValues("x"+ _ + "x").collect

res5:Array[(Int, String)] = Array((3,xdogx), (5,xtigerx), (4,xlionx), (3,xcatx),(7,xpantherx), (5,xeaglex))

4. flatMap

       与map类似,区别是RDD中的元素经map处理后只能生成一个元素,而RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。

val a =sc.parallelize(1 to 4, 2)

val b =a.flatMap(x => 1 to x)

b.collect

res12:Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)

       对原RDD中的每个元素x产生y个元素(从1到y,y为元素x的值)

5. flatMapValues

       flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。

val a =sc.parallelize(List((1,2),(3,4),(3,6)))

val b =a.flatMapValues(x=>x.to(5))

b.collect

res3:Array[(Int, Int)] = Array((1,2), (1,3), (1,4), (1,5), (3,4), (3,5))

       上述例子中原RDD中每个元素的值被转换为一个序列(从其当前值到5),比如第一个KV对(1,2), 其值2被转换为2,3,4,5。然后其再与原KV对中Key组成一系列新的KV对(1,2),(1,3),(1,4),(1,5)。

5. 代码演示reduceByKey

       reduceByKey针对KV形式的RDD。顾名思义,他以Key作为元素的分组依据,然后对具有相同Key的Value进行相应的函数计算,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。

val a =sc.parallelize(List((1,2),(3,4),(3,6)))

a.reduceByKey((x,y)=> x + y).collect

res7: Array[(Int,Int)] = Array((1,2), (3,10))

       上述例子中,对Key相同的元素的值求和,因此Key为3的两个元素被转为了(3,10)。

6. 代码演示filter

       对于RDD中的每一个元素,使用指定的函数进行计算,对于返回值为true的元素,筛选出来作为新RDD的元素

valrdd7=sc.makeRDD(1 to 10).filter(_%3==0)

rdd7.collect

res7:Array[(Int, Int)] = Array(3,6,9)

       以上就是Spark RDD中比较常见的几个转换操作。Spark中的转换操作是用户基于已有RDD创建新的RDD的一种重要方式。

感谢董轶群老师提供文章资料!


附赠《Java高级篇--创建类和构造对象》视频教程:


【CDA数据分析师学习之路】《Java高级篇--创建类和构造对象》视频教程


特好消息:


CDA数据分析师学习之路出系列了,每篇都有数据分析、大数据相关文章和视频,各大名师主讲,每周一、二、四、五更新!


CDA数据分析师就业班第四期4月10号开课啦!https://bbs.pinggu.org/thread-4160404-1-1.html


CDA大数据分析师就业班第二期4月17号开课啦!https://bbs.pinggu.org/thread-4160397-1-1.html


上一篇:

CDA数据分析师学习之路(3)https://bbs.pinggu.org/thread-4196702-1-1.html


下一篇:
CDA数据分析师学习之路(5)https://bbs.pinggu.org/thread-4200602-1-1.html


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-1-29 09:54:38
又来一篇,好好好!
有了这个活动之后,每天都会打开论坛,等待更新,希望我们的活动越办越好
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 10:04:52
CDA数据分析师学习之路,免费  免费   还是免费
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 10:26:02
持之以恒产生内容,毫不妥协优化内容,未来可期。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 10:42:53
下一次更新在下星期一哦,敬请期待,我们会持续的优化和改善
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-1-29 11:56:46
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群