一起学spark(8) -- 针对两个pair rdd 的连接操作以及pair RDD 的行动操作

针对两个pair RDD的连接转化操作 (rdd = {(1,2),(3,4),(3,6)}  other = {(3,9)})

rdd.subtractByKey(other)   #删掉rdd中与other rdd 中的键相同的元素   {(1,2)}
rdd.join(other)            #对两个rdd内连接 {(3,(4,9)),(3,(6,9))}
rdd.leftOuterJoin(other)  #左连接 {(1,(2,None)),(3,(4,9)),(3,(6,9))}
rdd.rightOuterJoin(other) #右连接 {(3,(4,9)),(3,(6,9))}

Pair RDD的行动操作,以键值对集合{(1,2),(3,4),(3,6)} 为例

rdd.countByKey()     #对每个键对应的元素进行统计{(1,1),(3,2)}
rdd.collectAsMap()   #将结果以映射表的形式返回 Map{(1,2),(3,6)}
lookup(key)          #返回给定的键对应的所有值 rdd.lookup(3) {(3,4),(3,6)}

举例1:单词计数

rdd = sc.textFile("xxx.txt")
words = rdd.flatMap(lambda x:x.split())
result = words.map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y)

举例2:求每个键的平均值

sumCount = nums.combineByKey((lambda x:(x,1)),(lambda x,y:(x[0]+y,x[1]+1)),(lambda x,y:(x[0]+y[0],x[1]+y[1])))
sumCount.map(lambda x,y:(x,y[0]/y[1])).collectAsMap()

并行度优化和数据分组:
      每个RDD都有固定数目的分区,分区数决定了在RDD上被执行操作时的并行度,在执行聚合或分组操作时,可以要求spark使用给定的分区数。
       spark始终尝试根据集群的大小推断出一个有意义的默认值,但是有时候可能要对并行度进行调优来获取更好的性能表现

sc.parallelize(data).reduceByKey(lambda x,y:x+y) #默认并行度
sc.parallelize(data).reduceByKey(lambda x,y:x+y,10) #自定义并行度

分组:groupByKey() 会使用RDD中的键来对数据进行分组,也可以根据除键相同以外的条件进行分组,它可以接受一个函数,对源rdd中的每个元素使用该函数,将返回结果作为键值再进行分组
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值