本文共 4825 字,大约阅读时间需要 16 分钟。
Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark SQL、Spark Streaming、MLLib和GraphX等组件,也就是BDAS(伯克利数据分析栈),这些组件逐渐形成大数据处理一站式解决平台。从各方面报道来看Spark抱负并非池鱼,而是希望替代Hadoop在大数据中的地位,成为大数据处理的主流标准,不过Spark还没有太多大项目的检验,离这个目标还有很大路要走。
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集(Scala 提供一个称为 Actor 的并行模型,其中Actor通过它的收件箱来发送和接收非同步信息而不是共享数据,该方式被称为:Shared Nothing 模型)。在Spark官网上介绍,它具有运行速度快、易用性好、通用性强和随处运行等特点。1根据data.txt的数据分析某大学计算机系的成绩
(1)该系总共有多少学生; (2)该系共开设了多少门课程; (3)Tom同学的总成绩平均分是多少; (4)求每名同学的选修的课程门数; (5)该系DataBase课程共有多少人选修; (6)各门课程的平均分是多少; (7)使用累加器计算共有多少人选了DataBase这门课。 2 编写独立应用程序实现数据去重 对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C; 3.编写独立应用程序实现求平均值问题 每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.txt”)
res = lines.map(lambda x:x.split(“,”)).map(lambda x: x[0]) //获取每行数据的第1列 distinct_res = res.distinct() //去重操作 distinct_res.count()//取元素总个数 //265 lines = sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.txt”) res = lines.map(lambda x:x.split(“,”)).map(lambda x:x[1]) //获取每行数据的第2列 distinct_res = res.distinct()//去重操作 distinct_res.count()//取元素总个数 //8 Tom同学的总成绩平均分是多少; lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.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)(8)求每名同学的选修的课程门数;
lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.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)(9)该系DataBase课程共有多少人选修;
lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.txt”) res=lines.map(lambdax:x.split(“,”)).filter(lambda x:x[1]==”DataBase”) res.count()(10)各门课程的平均分是多少;
lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.txt”) res=lines.map(lambdax:x.split(“,”)).map(lambdax:(x[1],(int(x[2]),1))) //为每门课程的分数后面新增一列1,表示1个学生选择了该课程。格式如(‘ComputerNetwork’, (44, 1)) temp = res.reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1])) //按课程名聚合课程总分和选课人数。格式如(‘ComputerNetwork’, (7370, 142)) avg = temp.map(lambda x:(x[0], round(x[1][0]/x[1][1],2)))//课程总分/选课人数 = 平均分,并利用round(x,2)保留两位小数 avg.foreach(print)(11)使用累加器计算共有多少人选了DataBase这门课。
lines=sc.textFile(“file:///usr/local/spark/sparksqldata/Data01.txt”) res=lines.map(lambdax: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 //输出累加器的最终值对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C
from pyspark import SparkContext #初始化SparkContext sc = SparkContext(‘local’,‘remdup’) #加载两个文件A和B lines1 = sc.textFile(“file:///usr/local/spark/mycode/remdup/A”) lines2 = sc.textFile(“file:///usr/local/spark/mycode/remdup/B”) #合并两个文件的内容 lines = lines1.union(lines2) #去重操作 distinct_lines = lines.distinct() #排序操作 res = distinct_lines.sortBy(lambda x:x) #将结果写入result文件中,repartition(1)的作用是让结果合并到一个文件中,不加的话会结果写入到两个文件 res.repartition(1).saveAsTextFile(“file:///usr/local/spark/mycode/remdup/result”)查看结果:
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。
from pyspark import SparkContext #初始化SparkContext sc = SparkContext(‘local’,’ avgscore’) #加载三个文件Algorithm.txt、Database.txt和Python.txt lines1 = sc.textFile(“file:///usr/local/spark/mycode/avgscore/Algorithm.txt”) lines2 = sc.textFile(“file:///usr/local/spark/mycode/avgscore/Database.txt”) lines3 = sc.textFile(“file:///usr/local/spark/mycode/avgscore/Python.txt”) #合并三个文件的内容 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))) #将结果写入result文件中,repartition(1)的作用是让结果合并到一个文件中,不加的话会结果写入到三个文件 result.repartition(1).saveAsTextFile(“file:///usr/local/spark/mycode/avgscore/result”)经验总结
通过这次实验我熟悉了Spark的RDD基本操作及键值对操作,还有如何使用RDD编程解决实际具体问题的方法,但是我在这次实验中也是遇到一些问题的,首先是环境配置的为日,在做第二个实验的时候就出现过这个问题:经过查询发现是因为python是系统自带的,由于pyspark不在python的环境变量下,将资源的目录配置到python的环境变量下即可,如下图:
最后成功解决了这个问题;还有一个就是一开始对于RDD编程掌握得还不是很熟练,然后我看了之前做过的实验,再通过网络去查找一些相关的知识,最后也是做出来了,然后经过这一学期的大数据学习,我学习了很多spark的知识,虽然都是一些基础,但是打好基础自己的专业学习,以及以后的就业也是很有帮助的,最后感觉老师这一学期的淳淳教导,谢谢老师。转载地址:http://izfrf.baihongyu.com/