RDD实验

  1. 需求描述

本次实验有三个小题,所以有三个大需求和各类小需求。

.pyspark交互式编程

根据提供的data.txt,分析里面因为是学生课程的成绩表,所以说一下是对data.txt的需求:

(1)该系总共有多少学生;

(2)该系共开设了多少门课程;

(3)Tom同学的总成绩平均分是多少;

(4)求每名同学的选修的课程门数;

(5)该系DataBase课程共有多少人选修;

(6)各门课程的平均分是多少;

(7)使用累加器计算共有多少人选了DataBase这门课。

. 编写独立应用程序实现数据去重

需求:对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。

三. 编写独立应用程序实现求平均值问题

每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。本文给出门课的成绩(Algorithm.txt、Database.txt、Python.txt)

             

  1. 环境介绍

操作系统:Ubuntu16.04

Spark版本:2.4.0

Python版本:3.8.3

在此过程中,Python的版本不能小于3.8,不然会有语句他会直接报错。这个是软件的版本问题,所以须注意。而在安装ubantu的过程中,也是有一个方法:就是断网来安装。这样子他就会极简的安装虚拟机然后你再按需再下载你所需要的软件或插件。

  1. 数据来源描述

这些数据都是来源老师提供的,一共有6个数据表。分别是:A.txt、Algorithm.txt、B.txt、data.txt、Database.txt、Python.txt。

     

     

  1. 数据上传及上传结果查看

数据获取后的数据上传我是通过QQ邮箱给自己发邮件再在ubantu内下载实现数据上传。然后再通过 #cp …(文件名) /目标路径实现自己想想要的位置

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. 该系总共有多少学生;

 

        1. 创建RDD

lines = sc.textFile(‘file:///home/hadoop/work/data.txt’)

        1. 通过’,’来切分然后去其中的第一行

res= lines.map(lamda x:x.split(‘,’)).map(lambda x:x[0])

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

sum = res.distinct()

        1. 对sum进行总数求和

     sum.count()

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

 

1.创建RDD

lines = sc.textFile(‘file:///home/hadoop/work/data.txt’)

     2.分三行取第二行

    res= lines.map(lamda x:x.split(‘,’)).map(lambda x:x[2])

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

dis_res = res.distinct()

        1. 统计所有会重复记录

dis_res.count()

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

 

1.生成RDD

lines = sc.textFile(‘file:///home/hadoop/work/data.txt’)

2.提取Tom的每门成绩,转化成int类型

res= lines.map(lamda x:x.split(‘,’)).filter(lambda x:x[0]==’Tom’)

3.map取第三行

Score = res.map(lambda x:int(x[2]))

4.统计有几门课程

sum_score = score.reduce(lambda x,y:x+y)

num = res.count()

 

5.最后是统计Tom总成绩的平均分

         avg = sum_score/num

         print(avg)

  1. 求每名同学的选修的课程门数;

 

1.生成RDD

lines = sc.textFile(‘file:///home/hadoop/work/data.txt’)

2.求出学生每门课程对应(学生姓名,1),学生课程有n门课,则有n个学生

  res= lines.map(lamda x:x.split(‘,’)).map(lambda x:(x[0],1))

3.按学生的姓名为key获取,获取每个学生的课程总数

each_res = res.reduceByKey(lambda x,y:x+y)

4.按照学生姓名分组统计他们选课数

each_res.foreach(print)

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

 

  1. 各门课程的平均分是多少;

 

 

1.生成RDD

lines = sc.textFile(‘file:///home/hadoop/work/data.txt’)

2.为每门课程的分数后面新增一列1,表示一个学生选择该课程

res= lines.map(lamda x:x.split(‘,’)).map(lambda x:(x[1],(int(x[2]),1)))

3.按课程名称统计总分数和选课人数

temp = res.reduceByKey(lambda x,y(x[0]+y[0],x[1]+y[1]))

 

4.求平均分

avg = temp.map(lambda x:(x[0],round(x[1][0]/x[1][1],2)))

avg.foreach(print)

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

 

1.生成RDD

2.找出选了DataBase课的人

3.选第一列,并去掉重复的人名

4.统计人数

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.编辑exam2.py 文件

2.python3.8运行exam2

 

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)

 

 

 

 

 

6、经验总结

我们使用Spark,是因为数据量太大或者运算太复杂,单机无法处理,需要运用分布式环境。以往单机编程中使用的数据结构如Int,List等,无法直接使用(比如我们 int i= 0,这 i 存储在哪里?哪一台机器?内存还是外存?)。在这种情况下,RDD(Resilient Distributed Datasets ,弹性分布式数据集) 应运而生,他就是分布式系统上的数据结构。

Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。用户可以使用两种方法创建 RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合(比如 list 和 set)。

  创建出来后,RDD 支持两种类型的操作:转化操作(transformation)和行动操作(action)。转化操作会由一个 RDD 生成一个新的 RDD。另一方面,行动操作会对 RDD 计算出一个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统(如 HDFS)中。

  转化操作和行动操作的区别在于 Spark 计算 RDD 的方式不同。虽然你可以在任何时候定义新的 RDD,但 Spark 只会惰性计算这些 RDD。它们只有第一次在一个行动操作中用到时,才会真正计算。这种策略刚开始看起来可能会显得有些奇怪,不过在大数据领域是很有道理的。例如 Spark 在我们运行 lines = sc.textFile(...) 时就把文件中所有的行都读取并存储起来,就会消耗很多存储空间,而我们马上就要筛选掉其中的很多数据。相反, 一旦 Spark 了解了完整的转化操作链之后,它就可以只计算求结果时真正需要的数据。事实上,在行动操作 first() 中,Spark 只需要扫描文件直到找到第一个匹配的行为止,而不需要读取整个文件。

  最后,默认情况下,Spark 的 RDD 会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个 RDD,可以使用 RDD.persist() 让 Spark 把这个 RDD 缓存下来。我们可以让 Spark 把数据持久化到许多不同的地方。在第一次对持久化的 RDD 计算之后,Spark 会把 RDD 的内容保存到内存中(以分区方式存储到集群中的各机器上),这样在之后的行动操作中,就可以重用这些数据了。

  在任何时候都能进行重算是我们为什么把 RDD 描述为“弹性”的原因。当保存 RDD 数据的一台机器失败时,Spark 还可以使用这种特性来重算出丢掉的分区,这一过程对用户是完全透明的。

  总的来说,每个 Spark 程序或 shell 会话都按如下方式工作。
   (1) 从外部数据创建出输入 RDD。
   (2) 使用诸如 filter() 这样的转化操作对 RDD 进行转化,以定义新的 RDD。
   (3) 告诉 Spark 对需要被重用的中间结果 RDD 执行 persist() 操作。
   (4) 使用行动操作(例如 count() 和 first() 等)来触发一次并行计算,Spark 会对计算进行优化后再执行。

这次实验是对我们之前学习的一个大检测。对于这些题目虽然说都是学过的,是会比无头苍蝇般好些,但是也并非一帆风顺。首先就是数据表里面的数据是存在有误的,有一行数据是中间只有空格。其次就是在编辑过程中,会有一些Linux的操作技术,得益于上学期学的Linux,所以这些文件操作也都还行。也要注意到python的版本,3.0的版本在课程实验中已经尝试过是不可运行的,所以必须需要3.8版本的python。最后就是逻辑上的提升,我自己独立去完成一套实验测试,培养自己动手能力也锻炼我自己解决问题的能力。而这些都是未来学习中不可或缺的一种品质

在Spark 中,对数据的所有操作不外乎创建RDD、转化已有RDD 以及调RDD 操作进行求值。而在这一切背后,Spark 会自动将RDD 中的数据分发到集群上,并将操作并行化执行

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值