1.需求描述
1.pyspark交互式编程
本作业提供分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:
Tom,DataBase,80
Tom,Algorithm,50
Tom,DataStructure,60
Jim,DataBase,90
Jim,Algorithm,60
Jim,DataStructure,80
……
请根据给定的实验数据,在pyspark中通过编程来计算以下内容:
(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)
2.环境介绍
1.虚拟机:VirtualBox6.1
VirtualBox号称是最强的免费虚拟机软件,它不仅具有丰富的特色,而且性能也很优异,操作简单。
2.操作系统:Ubuntu16.04
Ubuntu提供了一个健壮、功能丰富的计算环境,既适合家庭使用又适用于商业环境。推荐16.04版本,它已经自带了Python 3.5版本。
3.Spark版本:2.4.0
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。
4.Python版本:3.4.3
Python语言具有简洁性、易读性以及可扩展性。
3.数据来源描述
1.pyspark交互式编程
本作业提供分析数据data.txt,该数据集包含了某大学计算机系的成绩,其中信息包含有学生姓名,课程名和成绩。
2. 编写独立应用程序实现求平均值问题
本文给出门课的成绩(A.txt、B.txt)。
3. 编写独立应用程序实现求平均值问题
本文给出门课的成绩(Algorithm.txt、Database.txt、Python.txt),其中信息包含有姓名和成绩。
4.数据上传及上传结果查看
利用FileZilla软件上传数据
(1)设置网络连接方式
先关闭虚拟机,在VirtualBox界面的左上角,点击齿轮图标的“设置”按钮,打开设置界面,在左边栏目中选择“网络”,会出现如下图1所示的设置界面。如下图所示,需要在“连接方式”中选择“桥接网卡”,在“界面名称”后面的下拉列表框中选择电脑当前连接到互联网的网卡,然后,点击“确定”。经过上述设置后,再启动进入Ubuntu系统,就可以让主机访问到虚拟机了。
图 1 Ubuntu网络设置
(2)设置FTP软件
进入Shell命令提示符状态,输入命令“ifconfig”,会得到如下图2所示结果,其中,“inet地址:192.168.137.124”就表示Linux虚拟机的IP地址是192.168.137.124。
图 2 查看虚拟机的IP
获得Linux虚拟机IP地址信息以后,就可以使用FTP软件FileZilla连接Linux虚拟机了。打开FileZilla,启动后的界面如下图3所示。点击界面左下角“新站点”按钮,然后,开始设置各种连接参数,具体参数如图所示。
图 3 FileZilla站点管理
设置完成以后,点击界面下边的“连接”按钮,开始连接Linux虚拟机。连接成功以后,会显示如下图4所示界面,就可以使用FTP软件FileZilla向Ubuntu系统中传输文件了。
图 4 FileZilla连接成功后界面
(3)上传下载文件
FileZilla连接成功以后的界面包括2个主要区域。其中,左侧的“本地站点”区域,会显示Windows系统中的目录,点击某个目录以后,下面就会显示目录中的文件信息。右边的“远程站点”区域,是Linux虚拟机中的目录,可以选择一个目录,作为文件上传后要存放的位置。当需要把Windows中的某个文件上传到Linux虚拟机中时,首先在“远程站点”中选择好上传后的文件所要存放的目录,然后,在“本地站点”中选择需要上传的文件,并在该文件名上点击鼠标右键,在弹出的菜单中选择“上传”,就可以轻松完成文件的上传操作。如果要把Linux虚拟机中的某个文件下载到Windows系统中,可以首先在“本地站点”中选择好下载后的文件所要存放的目录,然后,在“远程站点”中找到要被下载的文件,在文件名上点击鼠标右键,在弹出的菜单中选择“下载”,就可以完成文件的下载。
如图5所示,文件数据从window传linux,注意Linux系统对文件访问权限有着严格的规定,如果目录和文件的访问权限没有授权给某个用户,那么,该用户是无法访问这些目录和文件的。因为用户名hadoop连接,所以只能把文件上传到Ubuntu系统中hadoop用户的主目录,也就是“/home/hadoop”目录,是无法对其他目录进行操作的,企图把文件传输到其他目录下就会失败。
图 5 传输数据
(5)上传结果查看
进入Ubuntu系统中,然后打开Shell命令提示符状态,cd进入hadoop用户的主目录,输入命令“ls”,结果如图6所示。
图 6 Shell查看文件
5.数据处理过程描述
1.pyspark交互式编程
进入Ubuntu系统中,然后打开Shell命令提示符状态,cd进入/usr/local/spark目录,ls查看是否有目录pysparkdata,没有则通过命令“mkdir pysparkdata”创建,有就直接“cd pysparkdata”进入该目录,再将第一个需求所要的数据“data.txt”复制到此目录下。过程如图7所示。
图 7 复制data数据
在Shell中输入“pyspark”,启动pyspark接下来就可以对数据按照需求进行处理。
(1)该系总共有多少学生;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> res = lines.map(lambda x:x.split(",")).map(lambda x: x[0]) //获取每行数据的第1列
>>> sum = res.distinct() //去重操作
>>> sum.count()//取元素总个数
//结果为:265
执行后如图8所示:
图 8 该系学生数
(2)该系共开设了多少门课程;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> res = lines.map(lambda x:x.split(",")).map(lambda x:x[1]) //获取每行数据的第2列
>>> distinct_res = res.distinct()//去重操作
>>> distinct_res.count()//取元素总个数
//结果为:8
执行后如图9所示:
图 9 该系共开设了课程数
(3)Tom同学的总成绩平均分是多少;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> res = lines.map(lambda x:x.split(",")).filter(lambda x:x[0]=="Tom") //筛选Tom同学的成绩信息
>>> res.foreach(print)
>>> score = res.map(lambda x:int(x[2])) //提取Tom同学的每门成绩,并转换为int类型
>>> num = res.count() //Tom同学选课门数
>>> sum_score = score.reduce(lambda x,y:x+y) //Tom同学的总成绩
>>> avg = sum_score/num // 总成绩/门数=平均分
>>> print(avg)
//结果为:30.8
执行后如图10所示:
图 10 Tom同学的总成绩平均分
(4)求每名同学的选修的课程门数;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> res = lines.map(lambda x:x.split(",")).map(lambda x:(x[0],1)) //学生每门课程都对应(学生姓名,1),学生有n门课程则有n个(学生姓名,1)
>>> each_res = res.reduceByKey(lambda x,y: x+y) //按学生姓名获取每个学生的选课总数
>>> each_res.foreach(print)
执行后如图11所示:
图 11 每名同学的选修的课程门数
(5)该系DataBase课程共有多少人选修;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> dis_lines = lines.distinct() //去除重复数据
>>> res = dis_lines.map(lambda x:x.split(",")).filter(lambda x:x[1]=="DataBase")
>>> res.count()
//结果为:126
执行后如图12所示:
图 12 该系DataBase课程选修人数
(6) 各门课程的平均分是多少;
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> res = lines.map(lambda x:x.split(",")).map(lambda x:(x[1],(int(x[2]),1))) //为每门课程的分数后面新增一列1,表示1个学生选择了该课程。格式如('ComputerNetwork', (44, 1))
>>> tmp = res.reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1])) //按课程名聚合课程总分和选课人数。格式如('ComputerNetwork', (7370, 142))
>>> avg = tmp.map(lambda x:(x[0], round(x[1][0]/x[1][1],2)))//课程总分/选课人数 = 平均分,并利用round(x,2)保留两位小数
>>> avg.foreach(print)
执行后如图13所示:
图 13 各门课程的平均分
(7)使用累加器计算共有多少人选了DataBase这门课。
执行步骤:
>>> lines = sc.textFile("file:///usr/local/spark/pysparkdata/data.txt")
>>> dis_lines = lines.distinct() //去除重复数据
>>> res = dis_lines.map(lambda x:x.split(",")).filter(lambda x:x[1]=="DataBase")//筛选出选了DataBase课程的数据
>>> accum = sc.accumulator(0) //定义一个从0开始的累加器accum
>>> res.foreach(lambda x:accum.add(1))//遍历res,每扫描一条数据,累加器加1
>>> accum.value //输出累加器的最终值
//结果为:126
执行后如图14所示:
图 14 累加器计算选了DataBase课程
2.编写独立应用程序实现数据去重
进入Ubuntu系统中,然后打开Shell命令提示符状态,cd进入/usr/local/spark目录,ls查看是否有目录mycode/remdup,没有则通过命令“mkdir -p mycode/remdup”创建,有就直接“cd mycode/remdup”进入该目录,再将第二个需求所要的数据“A.txt,B.txt”复制到此目录下。
(1)目录为/usr/local/spark/mycode/remdup,在当前目录下编辑vim remdup.py文件,如图15所示,内容为:
图 15 remdup.py文件
(2)目录/usr/local/spark/mycode/remdup下执行下面命令,如图16所示执行程序:python3 remdup.py
图 16 执行程序python3 remdup.py
(3)在目录/usr/local/spark/mycode/remdup/result下即可得到结果文件part-00000 _SUCCESS,如图17所示。
图 17 目录中查看结果文件
(4)查看 vim part-00000 _SUCCESS,如图18所示
图 18 查看结果文件part-00000内容
3.编写独立应用程序实现求平均值问题
进入Ubuntu系统中,然后打开Shell命令提示符状态,cd进入/usr/local/spark/mycode目录,ls查看是否有目录avgscore,没有则通过命令“mkdir avgscore”创建,有就直接“cd mycode/ avgscore”进入该目录,将第三个需求所要的数据“Algorithm.txt、Database.txt、Python.txt”复制到此目录下。
(1)当前目录为/usr/local/spark/mycode/avgscore,在当前目录下新建一个avgscore.py,如图19所示,内容为:
图 19 avgscore.py文件内容
(2)在目录/usr/local/spark/mycode/avgscore下执行下面命令,如图20所示,执行程序:python3 avgscore.py
图 20 执行程序python3 avgscore.py
(3)在目录/usr/local/spark/mycode/avgscore/result下即可得到结果文件part-00000,如图所示:
图 22 目录中查看结果文件part-00000
(4)查看 vim part-00000 _SUCCESS,如图22所示 :
图 23 查看 vim part-00000内容
6.经验总结
我实验过程中的经验和注意的问题。安装VirtualBox虚拟机时,可能会弹出一些窗口询问是否要安装某些软件,一定要点击同意安装,否则,虚拟机不能正常运行。卸载虚拟机时,切不可直接在文件夹里删除,应该点击安装包,通过安装程序的“卸载”功能完成卸载。如果直接在文件夹中删除了虚拟机,导致虚拟机无法运行,建议下载360安全助手,彻底清理注册表后,再次安装。
想要资料在Windows系统和Ubuntu系统相互传输,方法有多种,可以利用邮箱来传输数据,还可以网盘等等。推荐使用的是FTP软件来传输,比较简单,快速方便。使用FTP传输,注意网络使用的是桥接,虚拟机里外网络要ping通,每次重新启动虚拟机,或者在不同的地方启动虚拟机,IP地址都可能会发生变化,所以,每次登录Ubuntu系统以后,都需要重新查询IP地址。
进行pyspark编程,需要注意的是那些数据文件和编写的python文件,文末都不要留空格和换行,我就是发现数据文件如果出现上述情况执行就一直报错,找不到原因,弄了很久才发现是数据文件后面有很多换行。
各软件版本也很重要,pyspark最好2.4以上,3.x都行,python用3.0以上,否则都有可能会报错。
最后,对RDD编程的个人总结。RDD编程都是从创建RDD开始的,我们可以通过多种方式创建得到RDD,比如,从本地文件或者分布式系统HDFS中读取数据创建RDD。创建得到RDD以后,就可以对RDD执行各种操作,包括转换操作和行动操作。