6. RDD综合练习:更丰富的操作

点击查看代码
'''
	sc.txt文件 
		字段名: 姓名, 课程, 分数 
'''

# 读取文件创建RDD 并进行处理转换持久化
lines = sc.textFile("file:///home/ywm/sc.txt")
skv = lines.map(lambda line:line.split(',')).map(lambda line:(line[0],(line[1],int(line[2]))))
skv.cache()
# 总共有多少学生?map(), distinct(), count()
skv.keys().distinct().count()
# 开设了多少门课程?
skv.values().keys().distinct().count()

# 生成(姓名,课程分数)键值对RDD,观察keys(),values()--第一步处理转换已生成符合要求的RDD
skv.keys().take(3)
skv.values().take(3)
# 每个学生选修了多少门课?map(), countByKey() --查看某个学生的+['学生名字'] eg:skv.countByKey()['Bing']
skv.countByKey()
# 每门课程有多少个学生选?map(), countByValue() 
skv.values().countByKey()
# 有多少个100分?
skv.values().values().countByValue()[100]

# Tom选修了几门课?每门课多少分?filter(), map() RDD
skv.countByKey()['Tom']
skv.filter(lambda line:(line[0]=='Tom')).values().collect()
# Tom选修了几门课?每门课多少分?map(),lookup()  list
len(skv.lookup('Tom'))
skv.lookup('Tom')

# Tom的成绩按分数大小排序。filter(), map(), sortBy()
skv.filter(lambda line:(line[0]=='Tom')).values().sortBy(lambda line:line[1],False).collect()
# Tom的平均分。map(),lookup(),mean()
sc.parallelize(skv.lookup('Tom')).map(lambda line:line[1]).mean()

# 生成(课程,分数)RDD,观察keys(),values()
nckv=lines.map(lambda line:line.split(',')).map(lambda line:((line[0],line[1]),int(line[2])))
nckv.first()
nckv.keys().take(3)
nckv.values().take(3)
# 每个分数+5分。mapValues(func)
nckv.mapValues(lambda  v:v*0.8+5).take(3)

# 求每门课的选修人数及平均分 
#0 准备 (前面lines已经生成好了:lines = sc.textFile("file:///home/ywm/sc.txt"))
cs = lines.map(lambda line:line.split(',')).map(lambda line:(line[1],int(line[2])))
cs.cache()
#1 lookup(),np.mean() 实现
for i in cs.countByKey():
     print(i, len(cs.lookup(i)),round(sc.parallelize(cs.lookup(i)).mean(),2)) 
#2 reduceByKey()和collectAsMap() 实现
cs_cbk=cs.countByKey()
cs_rbk_m = cs.reduceByKey(lambda a,b:a+b).collectAsMap()
for i in cs_cbk:
     print(i,cs_cbk[i],cs_rbk_m[i]/cs_cbk[i])
#3 combineByKey(),map(),round() 实现,确到2位小数
cs.combineByKey(lambda v:(v,1),lambda c,v:(c[0]+v,c[1]+1),lambda c1,c2:(c1[0]+c2[0],c1[1]+c2[1])).mapValues(lambda v:(v[1],round(v[0]/v[1],2))).map(lambda l:(l[0],l[1][0],l[1][1])).first()
#4 比较几种方法的异同。

'''
多个考勤文件,签到日期汇总,出勤次数统计
      键值对RDD的内连接与外连接
      join(), leftOuterJoin(), rightOuterJoin(), fullOuterJoin()
'''

集合运算练习

  • union(), intersection(),subtract(), cartesian()

三、学生课程分数

网盘下载sc.txt文件,通过RDD操作实现以下数据分析:

  • 持久化 scm.cache()

  • 总共有多少学生?map(), distinct(), count()

  • 开设了多少门课程?

  • 生成(姓名,课程分数)键值对RDD,观察keys(),values()

  • 每个学生选修了多少门课?map(), countByKey()

  • 每门课程有多少个学生选?map(), countByValue()

  • 有多少个100分?

  • Tom选修了几门课?每门课多少分?filter(), map() RDD

  • Tom选修了几门课?每门课多少分?map(),lookup() list

  • Tom的成绩按分数大小排序。filter(), map(), sortBy()

  • Tom的平均分。map(),lookup(),mean()

  • 生成(课程,分数)RDD,观察keys(),values()

  • 每个分数+5分。mapValues(func)

  • 求每门课的选修人数及平均分

    • reduceByKey()和collectAsMap()实现

    • lookup(),np.mean()实现 (我的pyspark主机上未安装numpy库--安装略)

    • combineByKey(),map(),round()实现,确到2位小数

    • 比较几种方法的异同。

多个考勤文件,签到日期汇总,出勤次数统计
键值对RDD的内连接与外连接
join(), leftOuterJoin(), rightOuterJoin(), fullOuterJoin()

posted @ 2022-04-13 08:42  叶文茂  阅读(87)  评论(0编辑  收藏  举报
TOP