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

1. 持久化 scm.cache()

持久化2

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

distinct():数据去重

学生总数

3. 开设了多少门课程?

课程总数

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

生成键值对

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

每个学生选修门数

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

每门课程学生人数

7. 有多少个100分?

100分个数

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

Tom选修1

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

Tom选修2

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

sortBy()内False升序,True降序

Tom成绩排序

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

lookup():对<key,value>型的rdd操作,返回指定key对应的元素形成的seq

mean():第三方库numpy库的函数,用于求取均值

(没有numpy库的可自行安装pip install numpy,安装成功后重进pyspark即可)

Tom平均分

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

生成RDD2

13. 每个分数+20平时分

  • mapValues(func)

分数+20

  • map(func)

map分数+20

查看不及格人数的变化

查看不及格人数

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

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

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')

结果可视化1

生成的html会保存在/home/xx/目录下
效果图如下👇🏻

结果可视化2

posted @ 2022-04-10 20:56  ztop  阅读(221)  评论(0编辑  收藏  举报