RDD编程初级实践

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执行各种操作,包括转换操作和行动操作。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值