天天看點

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版)部分章節(暫時找不到具體連結了)

繼續閱讀