- 需求描述
- 熟悉Spark的RDD基本操作及键值对操作;
- 熟悉使用RDD编程解决实际具体问题的方法。
本次实验需要使用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这门课。
2. 对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。本文给出门课的成绩(A.txt、B.txt)下面是输入文件和输出文件的一个样例,供参考。
输入文件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
3. 每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。本文给出门课的成绩(Algorithm.txt、Database.txt、Python.txt),下面是输入文件和输出文件的一个样例,供参考。
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
为了满足大数据的增长需求以及更好的对数据进行处理得到数据中的有用信息,很多的时间场景下,Hadoop的计算速度以及模式已经不能完全的满足计算分析的需求,所以,在hadoop的基础上,我们增加了另外一个新的技术spark。Apache Spark是一种快速通用的集群计算系统。它提供Java,Scala,Python和R中的高级API,以及使用最先进的DAG调度,查询优化器和物理执行引擎,实现了在数据处理方面的一个高速和高性能,而且spark中封装了大量的库,例如 SQL和DataFrames,MLlib机器学习,GraphX和spark Streaming 可以在应用程序中直接使用在这个库,而且,为了实现spark的通用性,目前spark支持local、standalone、mesos、yarn四种运行模式,Spark是主要有scala语言进行编写,当然也包括java甚至是python。然而我们最主要学习的是RDD编程初级实践(基于python)。
- 环境介绍
该次实验的所有数据皆来自于指导老师提供的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文件。
- 数据来源描述
该次实验的所有数据皆来自于指导老师提供的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文件。
其中,第一题里所用到的的data.txt,去只不过,第一个数据是名字,第二个数据是课程名称,第三个数据为成绩,其格式为:
Aaron,OperatingSystem,100
Aaron,Python,50
Aaron,ComputerNetwork,30
Aaron,Software,94
Abbott,DataBase,18
......
第二题,需要用到A.txt和B.txt,其中前面的是学号,后面的课程,其格式为:
20200101 x
20200102 y
20200103 x
20200104 y
......
第三题,需要用到Algorithm.txt、Database.txt和Python.txt文件,其中,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩,其格式为:
小明a 92
小红a 87
小新a 75
......
- 数据上传及上传结果查看
1.第一题:
- 该系总共有多少学生;
- 创建RDD
- 拆分每行记录,取出每行的第一个元素
- 去除文件中的重复记录
- 统计所有非重复记录
- 该系共开设了多少门课程;
1.创建RDD
2.拆分每行记录,取出每行的第一个元素
3.去除文件中的重复记录
4.统计所有非重复记录
- Tom同学的总成绩平均分是多少;
提取Tom的每一门成绩,并转换为int类型
统计1Tmo有多少门课
统计Tom的总成绩
- 求每名同学的选修的课程门数;
- 生成RDD
- 求出学生每门课程对应(学生姓名,1),学生有N门课,则有n个学生。
- 按学生姓名为key获取每个学生的课程总数。
- 按照学生姓名分组统计他们选的课程数。
- 该系DataBase课程共有多少人选修;
- 生成RDD
- 各门课程的平均分是多少;
- 生成RDD
- 为每门课程的分数后面新增一列1,表示一个学生选择了该门课程。
- 按课程名称统计总分数和选课人数。
- 求平均分。
- 使用累加器计算共有多少人选了DataBase这门课。
2.第二题:
- 新建并输入A.txt,B.txt两个文件。
- 在当前目录下新建一个remdup.py文件
- 运行py程序 python3.8 remdup.py
4、在目录/usr/local/spark/mycode/remdup/result下即可得到结果文件part-00000。
2.第三题:
在当前目录为/usr/local/spark/mycode/avgscore,在当前目录下新建一个avgscore.py;
- 执行avgscore.py,最后在目录/usr/local/spark/mycode/avgscore下执行下面命令执行程序 python3.8 avgscore.py
- 在目录/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]))
其后分别对数据进行了各种查询,累加,均值等处理。
desc:升序 asc:降序
第二题:
需要对插入的两个的数据进行联合
Lines = lines1.union(lines2)
然后进行去重
Dis_lines = lines.distinct()
然后进行排序操作
res = dis_lines.sortBy(lambda x:x)
用反射来推断包含特定类型对象的RDD的schema,适用对已知数据结构的RDD转换;
第三题:
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、经验总结
通过这次大作业使我更加熟悉了RDD的基本操作,学会了如何加载数据创建RDD以及其转换操作,对spark的RDD操作有了进一步的认识。熟悉Spark的RDD基本操作及键值对操作、使用RDD编程解决实际具体问题的方法。也使我更加了解了大数据spark这门课。
RDD(Resilient Distributed Datasets),弹性分布式数据集, 是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。对开发者而言,RDD可以看作是Spark的一个对象,它本身运行于内存中,如读文件是一个RDD,对文件计算是一个RDD,结果集也是一个RDD ,不同的分片、 数据之间的依赖 、key-value类型的map数据都可以看做RDD。
该次实验其实我也是遇到了难题的,虽然说并不是什么大错误,但是却非常地致命,就比如一些微小的语法错误,一些漏掉了括号,让我懂得了,以后写代码的时候要非常仔细,写括号的时候要两边的括号一起写,这样一来,漏掉括号的机会就很少了;其次就是,spark rdd处理数据的时候,有一个很关键的的点就是,要看你即将处理的数据和你编写的程序的最后面是否有多余的空格,这个真的很关键,不然会报错。在使用linux的过程中也发现了很多自己的不足之处,接下去会继续学习这方面的知识。