2021-6-14

  1. 需求描述

本次实验需要使用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)

 

  1. 环境介绍

本次实验所使用的主要软件是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. 数据上传及上传结果查看

1.第一题:

 

 

 

  1. 该系总共有多少学生;
  1. 创建RDD
  2. 拆分每行记录,取出每行的第一个元素
  3. 去除文件中的重复记录
  4. 统计所有非重复记录

 

  1. 该系共开设了多少门课程;

1.创建RDD

2.拆分每行记录,取出每行的第一个元素

3.去除文件中的重复记录

4.统计所有非重复记录

 

  1. Tom同学的总成绩平均分是多少;

提取Tom的每一门成绩,并转换为int类型

统计1Tmo有多少门课

统计Tom的总成绩

 

 

 

  1. 求每名同学的选修的课程门数;
  1. 生成RDD
  2. 求出学生每门课程对应(学生姓名,1),学生有N门课,则有n个学生。
  3. 按学生姓名为key获取每个学生的课程总数。
  4. 按照学生姓名分组统计他们选的课程数。

 

  1. 该系DataBase课程共有多少人选修;
  1. 生成RDD

 

  1. 各门课程的平均分是多少;
  1. 生成RDD
  2. 为每门课程的分数后面新增一列1,表示一个学生选择了该门课程。
  3. 按课程名称统计总分数和选课人数。
  4. 求平均分。

 

  1. 使用累加器计算共有多少人选了DataBase这门课。

 

 

 

2.第二题

 

  1. 初始化SparkContext
  2. 加载两个文件A和B
  3. 合并两个文件的内容
  4. 去重
  5. 排序
  6. 将结果写进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进行处理,非常感谢!

上一篇 2021年5月11日
下一篇 2021年5月11日

相关推荐