- 需求描述
本次实验需要根据所得的数据进行三个实验,一个是pyspark交互式编程,一个是根据数据编写独立的应用程序实现数据的去重输出文件,还有编写独立应用程序实现求平均值问题然后的再输出文件,所以我们需要熟悉Spark的RDD基本操作及键值对操作,熟悉使用RDD编程解决实际具体问题的方法。虽然RDD中可以包含任何类型的对象,但是“键值对”是一种比较常见的RDD元素类型,分组和聚合操作中经常会用到。所以在课程的实验中,Spark操作中经常会用到“键值对RDD”(Pair RDD),用于完成聚合计算。“键值对RDD”里面存储的数据类型是“键值对”。 键值对RDD是Spark中许多操作所需要的常见数据类型。键值对RDD通常用来进行聚合运算,所以这次实验我们一般要先通过一些初始ETL(抽取,转化,装载)操作来将数据转化为键值对形式,然后输出文件得到实验需要结果内容。
2.环境介绍
1、一台笔记本电脑,系统:微软Windouws10操作系统
内存:16G,硬盘容量:1T;
2、虚拟机Linux操作系统:Ubuntu 16.04
3、Spark版本:3.1.1
4、Python版本:3.8.5
3.数据来源描述
该数据是大数据应用技术实验课程吉立建老师下发的数据文件,该数据是一个压缩文件,名称是2020-2021(1)-大数据应用技术课程实验-期末大作业,解压完后里面有7个文件,分别是18级2021上学期spark期末大作业.docx文件、A.txt、B.txt、data.txt、Algorithm.txt、Database.txt、Python.txt。其中docx文件是一个作业模板文件,data.txt文件是有265名学生的名字,还有每名学生的各个课程的名称,还有每个学生每门课程的分数,形成 名字,课程名称,分数 ,这样的格式的数据,例如: Aaron,Python,50。另外A.txt和B.txt文件是一个日期加字母的格式的数据,例如:20200101 x。最后Algorithm.txt、Database.txt、Python.txt文件是三个不同的数据文件,但格式都是名字加分数的格式,例如:小明a 92,以上就是我的数据来源。
4.数据上传及上传结果查看
(1)、首先,得把虚拟机ubuntu打开,然后点击安装增强功能
(2)、然后等待弹出运行界面,点击运行
(3)、等待安装完成,安装完成后重启,就可以实现windows与虚拟机ubuntu之间的文件传输共享了。
(4)、然后把windows的需要处理的数据文件拉到虚拟机ubuntu里面。
(5)、然后就可以查看传输过来的数据了
5、数据处理过程描述
1.pyspark交互式编程
本作业提供分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:
Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure,60 Jim,DataBase,90 Jim,Algorithm,60 Jim,DataStructure,80 …… |
请根据给定的实验数据,在pyspark中通过编程来计算以下内容:
(1)、在/usr/local/spark下新建一个mycode的目录
(2)、然后在mycode目录下输入编辑data.txt文件,然后在打开pyspark
(3)、该系总共有多少学生;
(4)、该系共开设了多少门课程;
(5)、Tom同学的总成绩平均分是多少;
(6)、求每名同学的选修的课程门数;
(7)、该系DataBase课程共有多少人选修;
(8)、各门课程的平均分是多少;
(9)、使用累加器计算共有多少人选了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
(1)、输入编辑文件A.txt和B.txt到/usr/local/spark/mycode的目录下
(2)、编写un.py文件
代码如下:
from pyspark import SparkContext
#初始化
sc = SparkContext('local','mycode')
#加载文件A和B
lines1 = sc.textFile("file:///usr/local/spark/mycode/A.txt")
lines2 = sc.textFile("file:///usr/local/spark/mycode/B.txt")
#合并
lines = lines1.union(lines2)
#去重
distinct_lines = lines.distinct()
#排序
res = distinct_lines.sortBy(lambda x:x)
#写入结果,repartition(1)的作用是把结果合并到一个文件中,否则结果会写入到两个文件
res.repartition(1).saveAsTextFile("file:///usr/local/spark/mycode/result")
(3)、运行un.py文件
(4)、然后cd到输出的result目录下查看输出的结果
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)
(1)、输入编辑Algorithm.txt、Database.txt、Python.txt文件到/usr/local/spark/mycode的文件目录中
(2)、在/usr/local/spark/mycode下编辑avgscore.py文件
代码如下:
from pyspark import SparkContext
#初始化SparkContext
sc = SparkContext('local','avgscore')
#加载三个文件,生产RDD
lines1 = sc.textFile('file:///usr/local/spark/mycode/Algorithm.txt')
lines2 = sc.textFile('file:///usr/local/spark/mycode/Database.txt')
lines3 = sc.textFile('file:///usr/local/spark/mycode/Python.txt')
#合并三个文件
lines = lines1.union(lines2).union(lines3)
#为每列数据增加一列1,方便统计学生的选修的课程数目
data=lines.map(lambda x:x.split(' ')).map(lambda x:(x[0],(int(x[1]),1)))
#根据key,也就是学生姓名合计每门课程成绩,以及选修课程的数目。
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)))
#将结果写入result文件中,repartition(1)的作用是把结果合并到一个文件夹中,否则结果会写
入到两个文件
result.repartition(1).saveAsTextFile("file:///usr/local/spark/mycode/avgresult")
(3)、运行avgscore.py文件,输出结果。
(4)、然后到mycode目录下的avgresult目录下查看输出的结果
6、经验总结
通过完成这次的大数据应用技术实验,使我更加熟悉了RDD的基本操作,学会了如何加载数据创建RDD以及其转换操作,对spark的RDD操作有了进一步的认识。熟悉Spark的RDD基本操作及键值对操作、使用RDD编程解决实际具体问题的方法。也使我更加了解了大数据spark这门课,对linux的命令记得更牢了。过程中也发现了很多自己的不足之处,比如搭环境时得细心,中英文符号得看清,不然会很容易报错,在运行程序时,发现总是报错,原因是因为修改过代码后有时会打错一两个字母等等的错误,所以在敲代码时必须有耐心。有耐心才能在一次次的失败中找到成功的路,在这个学期里,跟着老师敲了很多代码,老师讲课时都很通俗易懂,这样也会使我也很容易学习和接纳,在这个学期的学习中真的是受益良多,所以希望未来会继续学习这方面的知识,也希望在这个编程的道路虚心学习,越走越远。
参考文献和网站网址
[1]林子雨.大数据技术原理与应用[M].2版本. 北京:人民邮电出版社2017
[2] http://dblab.xmu.edu.cn/blog/1709-2/
[3] http://dblab.xmu.edu.cn/blog/1700-2/
[4] http://dblab.xmu.edu.cn/blog/1708-2/