6. RDD综合练习:更丰富的操作
网盘下载sc.txt文件,通过RDD操作实现以下数据分析:
持久化 scm.cache()
总共有多少学生?map(), distinct(), count()
开设了多少门课程?
每个学生选修了多少门课?map(), countByKey()
每门课程有多少个学生选?map(), countByValue()
多少个100分?
Tom选修了几门课?每门课多少分?filter(), map() RDD
Tom选修了几门课?每门课多少分?map(),lookup() list
Tom的成绩按分数大小排序。filter(), map(), sortBy()
Tom的平均分。map(),lookup(),mean()
生成(姓名课程,分数)RDD,观察keys(),values()
每个分数+20平时分。
分别用mapValues(func)和 map(func)实现。
并查看不及格人数的变化。
变化前不及格人数
mapValues(func)
map(func)
- 求每门课的选修人数及平均分
- lookup(),np.mean()实现
reduceByKey()和collectAsMap()实现
combineByKey(),map(),round()实现,确到2位小数
比较几种方法的异同
lookup,reduceByKey,combineByKey这三个函数都是针对键值对操作,以课程为键,分数为值,根据不同课程对分数进行统计计算
执行lookup得到的结果是单一课程的全部分数,需要再次计算该课程平均分,再通过循环得到全部课程的平均分
执行reduceByKey得到各课程的总分,需要再计算各课程的选修人数,再通过循环得到各个课程平均分
combineByKey需要提供三个函数,第一个函数将(k,v)中的 v 映射为 (v,1)-->c;
第二个函数根据“键”将初始化的c与v合并(此时的v还是最开始的值),形成新的c;
第三个函数将不同分区相同key的c合并,得到最终结果。
执行combineByKey可以直接得到各个课程的选修人数及总分,可以通过map直接得到各个课程的平均分
多个考勤文件,签到日期汇总,出勤次数统计
键值对RDD的内连接与外连接
join(), leftOuterJoin(), rightOuterJoin(), fullOuterJoin()