一、环境:
操作系统:Ubuntu18.04
Python 3.6.9
Spark 2.4.6
二、问题及题解
解题思路:
1、过滤掉选修的成绩记录,然后通过map构造(姓名,成绩)的键值对,经过一系列处理后通过得到每个学生必修课的平均成绩(代码即可看出思路)
2.通过自定义函数处理每个(姓名,平均分)键值对返回(“分数段”,1)键值对然后通过reduceBykey聚合得到每个分数段的总人数
三、测试数据、测试过程、测试结果
数据:
过程及结果:
四、源码:
from pyspark import SparkConf,SparkContext
def map_func(x):
s = x.split(",")
return (s[1], int(s[4]))
def map_func1(x):
if(x>=90 and x<=100):
return ("90~100", 1)
if(x>=80 and x<=89):
return ("80~89", 1)
if(x>=70 and x<=79):
return ("70~79", 1)
if(x>=60 and x<=69):
return ("60~69", 1)
if(x<60):
return ("<60:", 1)
conf = SparkConf().setMaster("local").setAppName("homework1")
sc = SparkContext(conf=conf)
textData = sc.textFile("/input_file1.txt")
lines = textData.filter(lambda line : "bixiu" in line).map(lambda x:map_func(x))
avgData = lines.mapValues(lambda x : (x,1)).reduceByKey(lambda x,y : (x[0]+y[0],x[1] + y[1])).mapValues(lambda x : int(x[0] / x[1]))
avgData.saveAsTextFile("/result1")
fData = avgData.map(lambda x:map_func1(x[1])).reduceByKey(lambda x,y : (x+y))
fData.saveAsTextFile("/result2")
参考资料:厦门大学数据库实验室spark(Python版)部分章节(暂时找不到具体链接了)