天天看点

pyspark求学生平均成绩

一、环境:

操作系统:Ubuntu18.04

Python 3.6.9

Spark 2.4.6

二、问题及题解

pyspark求学生平均成绩

解题思路:

1、过滤掉选修的成绩记录,然后通过map构造(姓名,成绩)的键值对,经过一系列处理后通过得到每个学生必修课的平均成绩(代码即可看出思路)

pyspark求学生平均成绩
pyspark求学生平均成绩

2.通过自定义函数处理每个(姓名,平均分)键值对返回(“分数段”,1)键值对然后通过reduceBykey聚合得到每个分数段的总人数

pyspark求学生平均成绩
pyspark求学生平均成绩

三、测试数据、测试过程、测试结果

数据:

pyspark求学生平均成绩

过程及结果:

pyspark求学生平均成绩
pyspark求学生平均成绩
pyspark求学生平均成绩

四、源码:

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版)部分章节(暂时找不到具体链接了)

继续阅读