6. RDD综合练习:更丰富的操作
集合运算练习
union(), intersection(),subtract(),cartesian()
内连接与外连接
join(), leftOuterJoin(), rightOuterJoin(), fullOuterJoin()
多个考勤文件,签到日期汇总,出勤次数统计
三、综合练习:学生课程分数
网盘下载sc.txt文件,通过RDD操作实现以下数据分析:
先切割字符串,再重新生成列表,方便后面的操作
>>> scm = sc.textFile("file:///home/zt/sc.txt").map(lambda line:line.split(',')).map(lambda line:[line[0],line[1],int(line[2])])
1. 持久化 scm.cache()
2. 总共有多少学生?map(), distinct(), count()
distinct():数据去重
3. 开设了多少门课程?
4. 生成(姓名,课程分数)键值对RDD,观察keys(),values()
5. 每个学生选修了多少门课?map(), countByKey()
6. 每门课程有多少个学生选?map(), countByValue()
7. 有多少个100分?
8. Tom选修了几门课?每门课多少分?filter(), map() RDD
9. Tom选修了几门课?每门课多少分?map(),lookup() list
10. Tom的成绩按分数大小排序。filter(), map(), sortBy()
sortBy()内False
升序,True
降序
11. Tom的平均分。map(),lookup(),mean()
lookup():对<key,value>型的rdd操作,返回指定key对应的元素形成的seq
mean():第三方库numpy
库的函数,用于求取均值
(没有numpy
库的可自行安装pip install numpy
,安装成功后重进pyspark
即可)
12. 生成(课程,分数)RDD,观察keys(),values()
13. 每个分数+20平时分
- mapValues(func)
- map(func)
查看不及格人数的变化
14. 求每门课的选修人数及所有人的总分。combineByKey()
>>> course = scm.map(lambda line:(line[1],line[2]))
>>> courseC = course.combineByKey(
... lambda v:(int(v),1),
... lambda c,v:(c[0]+int(v),c[1]+1),
... lambda c1,c2:(c1[0]+c2[0],c1[1]+c2[1]))
>>> courseC.collect()
15. 求每门课的选修人数及平均分,精确到2位小数。map(),round()
>>> courseC.map(lambda x:(x[0],x[1][1],round(x[1][0]/x[1][1], 2))).collect()
16. 求每门课的选修人数及平均分。用reduceByKey()实现,并比较与combineByKey()的异同。
>>> course = scm.map(lambda line:(line[1],(line[2],1)))
>>> result = course.reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1])).map(lambda a:(a[0],a[1][1],round(a[1][0]/a[1][1], 2))).collect()
>>> reuslt
17. 结果可视化。 pyecharts.charts,Bar()
course_name = [i[0] for i in result]
course_pnum = [i[1] for i in result]
course_mean = [i[2] for i in result]
from pyecharts.charts import Bar
from pyecharts import options as opts
bar = (
Bar(init_opts=opts.InitOpts(width="1500px"))
.add_xaxis(course_name)
.add_yaxis("选修人数", course_pnum)
.add_yaxis("平均分", course_mean)
.set_global_opts(title_opts=opts.TitleOpts(title="课程详情"),
toolbox_opts=opts.ToolboxOpts(),xaxis_opts=opts.AxisOpts(
axislabel_opts={"interval":"0"}))
)
bar.render('course.html')
生成的html会保存在/home/xx/目录下
效果图如下👇🏻