RDD编程初级实践
pyspark交互式编程
在Ubuntu中打开终端输入cd /usr/local/spark/dazuoye进入已经创建的dazuoye目录
输入ls查看目录下是否存在data.txt文件。
输入vim data.txt查看文件内容。
输入pyspark进入编程界面
使用lines储存读取data.txt文件里的内容
lines=sc.textFile(‘file:///usr/local/spark/dazuoye/data.txt’)
(1) 该系总共有多少学生;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是为每个词设置一个计数器
res = lines.map(lambda x:x.split(“,”)).map(lambda x:x[0])
使用spark的distinct进行去重
res.distinct()
用sum存去重后的数据
sum =res.distinct()
显示sum数值
sum.count()
(2) 该系共开设了多少门课程;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是为每个词设置一个计数器
res = lines.map(lambda x:x.split(“,”)).map(lambda x:x[1])
用dis_res存去重后的数据
dis_res =res.distinct()
显示dis_res数值
dis_res.count()
(3) Tom同学的总成绩平均分是多少;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是对RDD中的元素进行过滤选择名为Tom的列,返回形成新的RDD。
res = lines.map(lambda x:x.split(“,”)).filter(lambda x:x[]==’Tom’)
使用foreach算子显示数据
res.foreach(print)
num保存Tom同学的学科总数
num=res.count()
提取各科成绩
score = rep.map(lambda x:int(x[2]))
各科成绩相加
sum_score = score.reduce(lambda x,y:x+y)
avg存储总成绩除以科目数的数值
avg = sum_score/num
显示平均分数值
print(avg)
(4) 求每名同学的选修的课程门数;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是为每个词设置一个计数器
res = lines.map(lambda x:x.split(“,”)).map(lambda x:(x[0],1))
对相同key的数据进行处理,最终每个key只保留一条记录。
each_res=res.reduceByKey(lambda x,y:x+y)
使用foreach算子显示数据
each_res.foreach(print)
(5) 该系DataBase课程共有多少人选修;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是对RDD中的元素进行过滤选择名为DataBase的列,返回形成新的RDD。
res = lines.map(lambda x:x.split(“,”)).filter(lambda x:x[1]==’DataBase’)
显示res数值
res.count()
(6) 各门课程的平均分是多少;
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是为每个词设置一个计数器
res = lines.map(lambda x:x.split(“,”)).map(lambda x:(x[1],(int(x[2])),1))
对相同key的数据进行处理,最终每个key只保留一条记录,tem储存每科对应人数与每科总分
tem = res.reducByKey(ambda x,y(x[0]+y[0],x[1]+y[1]))
把数据以rdd的形式计算出每科平均分
avg = tem.map(lambda x(x[0],round(x[1][0]/x[1][1],2)))
使用foreach算子显示数据
avg.foreach(print)
(7) 使用累加器计算共有多少人选了DataBase这门课。
lines存储的是Row object类型
将其中的String取出,利用map api进一步转换RDD
第一步需要将字符串以逗号作为分隔符将单词提取出来
第二步是对RDD中的元素进行过滤选择名为DataBase的列,返回形成新的RDD。
res = lines.map(lambda x:x.split(“,”)).filter(lambda x:x[1]==’DataBase’)
使用累加器
accum=sc.accumulator()
在foreach算子里使用累加器计算
res.foreach(lambda x:accum.add(1))
显示累加数据
accum.value
编写独立应用程序实现数据去重
进入cd /usr/local/spark/dazuoye目录ls查看目录下文档
编辑完成后输入:wq!保存退出后再输入python3 remdup.py运行文件
运行后输入ls查看目录下是否有result文档
cd result进入文档ls查看目录下是否有part-00000文件
编写独立应用程序实现求平均值问题
输入cd /usr/local/spark/dazuoye/进入目录
ls查看文件目录
编写完毕后wq!保存退出编写界面
再输入python3 avgscore.py运行文件
最后进入liangzai文档ls查看是否运行成功
Vim part-00000查看生成文件内容