- 需求描述
本次实验需要使用Spark的RDD编程来解决一些基本问题,其中包括了如下需求:
1.分析数据data.txt,并通过该实验数据,在spark中通过编程实现以下内容:
Tom,DataBase,80
Tom,Algorithm,50
Tom,DataStructure,60
Jim,DataBase,90
Jim,Algorithm,60
Jim,DataStructure,80
(1)该系总共有多少学生;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少人选修;
(6)各门课程的平均分是多少;
(7)使用累加器计算共有多少人选了DataBase这门课。
输入文件A的样例如下:
20200101 x
20200102 y
20200103 x
20200104 y
20200105 z
20200106 z
输入文件B的样例如下:
20200101 y
20200102 y
20200103 x
20200104 z
20200105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20200101 x
20200101 y
20200102 y
20200103 x
20200104 y
20200104 z
20200105 y
20200105 z
20200106 z
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
- 环境介绍
本次实验所使用的主要软件是Oracle VM VirtualBox 6.1版本,使用实验电脑的外部操作系统是window10,镜像的操作系统是Ubuntu16.04,Spark版本是2.4.0,Python版本是3.8.7,使用该版本的python才可以在pyspark包里面导入SparkContext包,如果使用更低的版本的话,会导致导包语句 错。
该次实验的所有数据皆来自于指导老师提供的6份数据,分别为A.txt、B.txt、Algorithm.txt、data.txt、Database.txt、Python.txt,其实,第一题需要用到data.txt文件;第二题需要用到A.txt和B.txt文件;第三题所用的是Algorithm.txt、Database.txt和Python.txt文件。
- 数据上传及上传结果查看
1.第一题:
- 该系总共有多少学生;
- 创建RDD
- 拆分每行记录,取出每行的第一个元素
- 去除文件中的重复记录
- 统计所有非重复记录
- 该系共开设了多少门课程;
1.创建RDD
2.拆分每行记录,取出每行的第一个元素
3.去除文件中的重复记录
4.统计所有非重复记录
- Tom同学的总成绩平均分是多少;
提取Tom的每一门成绩,并转换为int类型
统计1Tmo有多少门课
统计Tom的总成绩
- 求每名同学的选修的课程门数;
- 生成RDD
- 求出学生每门课程对应(学生姓名,1),学生有N门课,则有n个学生。
- 按学生姓名为key获取每个学生的课程总数。
- 按照学生姓名分组统计他们选的课程数。
- 该系DataBase课程共有多少人选修;
- 生成RDD
- 各门课程的平均分是多少;
- 生成RDD
- 为每门课程的分数后面新增一列1,表示一个学生选择了该门课程。
- 按课程名称统计总分数和选课人数。
- 求平均分。
- 使用累加器计算共有多少人选了DataBase这门课。
2.第二题:
- 初始化SparkContext
- 加载两个文件A和B
- 合并两个文件的内容
- 去重
- 排序
- 将结果写进result里面
3.第三题:
假设当前目录为/usr/local/spark/mycode/avgscore,在当前目录下新建一个avgscore.py;
最后在目录/usr/local/spark/mycode/avgscore下执行下面命令执行程序
在目录/usr/local/spark/mycode/avgscore/result下即可得到结果文件part-00000。
5、数据处理过程描述
第一题:
拆分每行记录,取出每行的第一个元素
res = lines.map(lambda x:x.split(‘,’)).map(lambda x:x[0])
去除文件中的重复记录,简称“去重”
sum = res.distinct()
统计所有非重复记录
Sum.count()
把数据转成int类型
score = res.map(lambda x:int(x[2]))
其后分别对数据进行了各种查询,累加,均值等处理,这里就不一一细讲。
第二题:
需要对插入的两个的数据进行联合
Lines = lines1.union(lines2)
然后进行去重
Dis_lines = lines.distinct()
然后进行排序操作
res = dis_lines.sortBy(lambda x:x)
第三题:
首先!这里有个血的教训,卡了我很久很久,数据和自己写的python程序里面要记得后面不要留空格!不然程序会 错。
需要合并导入的三个数据集
lines = lines1.union(lines2).union(lines3)
为每行数据新增一列1,方便后续统计每个学生选修的课程数目,data的数据格式为(‘小明’, (92, 1))
data = lines.map(lambda x:x.split(“ ”)).map(lambda x:(x[0],(int(x[1]),1)))
根据key也就是学生姓名合计每门课程的成绩,以及选修的课程数目。res的数据格式为(‘小明’, (269, 3))
res = data.reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1]))
利用总成绩除以选修的课程数来计算每个学生的每门课程的平均分,并利用round(x,2)保留两位小数
result = res.map(lambda x:(x[0],round(x[1][0]/x[1][1],2)))
6、经验总结
首先,我想感谢我的老师吉立建老师在本学期对我的细心教导,通过本次大作业的实验过程,又让我加深了对大数据Spark RDD编程的印象,其中一些操作如今已经非常熟练,就比如说是初始化SparkContext、union联合操作以及distinct去重操作等等已经非常熟练。写程序刚起步确实是需要多打多练也要靠理解,一句一句要知道什么意思。
该次实验其实我也是遇到了难题的,虽然说并不是什么大错误,都是一些细枝末节,但是却非常地致命,就比如一些微小的语法错误,一些漏掉了括 ,让我懂得了,以后写代码的时候要非常仔细,写括 的时候要两边的括 一起写,这样一来,漏掉括 的机会就很少了;其次就是,spark rdd处理数据的时候,有一个很关键的的点就是,要看你即将处理的数据和你编写的程序的最后面是否有多余的空格,这个真的很关键,不然会 错。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!