spark--基本操作

本文通过王者荣耀案例,介绍了Spark中RDD的几种关键操作,包括内连接(join)、右连接(rightOuterJoin)、左连接(leftOuterJoin)、全连接(cogroup)和减连接(subtractByKey)。同时,还探讨了combineByKey的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

王者荣耀的一个小案例

rdd=sc.textFile("/user/hadoop/wangzhe.csv")
print(rdd.collect())
print("=="*50)
#1,统计王者荣耀一共赚了多少钱
rdd1=rdd.map(lambda x:x.split(",")).map(lambda x:int(x[2]))
print(rdd1.collect())
rdd1.reduce(lambda x,y:x+y)
print("=="*50)
#,2分别统计每个区共花了多少钱
rdd2=rdd.map(lambda x:x.split(",")).map(lambda x:(x[1],int(x[2])))
print(rdd2.collect())
print("=="*50)
rdd2.reduceByKey(lambda x,y:x+y).collect()
#3,分别统计每个人花了多少钱
rdd2=rdd.map(lambda x:x.split(",")).map(lambda x:(x[0],int(x[2])))
print(rdd2.collect())
print("=="*50)
rdd2.reduceByKey(lambda x,y:x+y).collect()
#统计每个人每个区花了多少钱
rdd3=rdd.map(lambda x:x.split(",")).map(lambda x:((x[0],x[1]),int(x[2])))
print(rdd3.collect())
print("=="*50)
rdd4=rdd3.reduceByKey(lambda x,y:x+y)
#按钱进行排序
rdd4.sortByKey(True).collect()
#按名字正序排序,名字相同,按区倒序排序
rs=rdd3.collect()
rs=sorted(rs,key=(lambda x:x[0][1]),reverse=True)
rs=sorted(rs,key=(lambda x:x[0][0]),reverse=False)
print(rs)

输出结果:


键值对的RDD有以下几种连接变换:

join -- 内连接:

spark = SparkContext.getOrCreate(conf)
rdd1 = spark.parallelize([('a',(2,4)),('b',3),('c',5)])
rdd2 = spark.parallelize([('x',1),('a',5),('t',9),('b',6)])
rdd7=rdd1.join(rdd2)
print(rdd7.collect())

 rightOuterJoin -- 右连接:

rdd8=rdd1.rightOuterJoin(rdd2)
print(rdd8.collect())

leftOuterJoin -- 左连接

cogroup -- 全连接

subtractByKey -- 减连接

combineByKey 变换例子:

keylist=['大专', "大专", '大专',"本科", '本科', "本科", '本科']
valuelist=[ 6000, 6600,7000,7800, 8000, 9000,10000,8900]
pair=zip(keylist,valuelist)
vec = sc.parallelize(pair)
print (vec.collect())
def createCombiner(x):
    return (x, 1)          #x初始化元组
def mergeValue(x, y):
    return (x[0] + y, x[1] + 1)      #x[0]+y代表的是值的和+x[1]+1是次数
def mergeCombiners(x, y):
    return (x[0] + y[0], x[1] + y[1])   #x[0]+y[0]是合并的和,x[1]+y[1]代表的是合并的次数
processed = vec.combineByKey(createCombiner, mergeValue, mergeCombiners)
print(processed.collect())
processed.mapValues(lambda xy: xy[0]/xy[1]).collectAsMap()

输出结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值