实验目的:
1.熟悉spark中RDD基本操作以及键值对操作
2.熟悉使用RDD编程解决实际问题
(RDD相关概念了解请转到:https://blog.csdn.net/qq_45997545/article/details/116070113)
实验内容:
pyspark编程:按照要求处理给的数据集
数据集格式如下:
(1)该系共有多少名学生
#载入数据
print("###该系共有多少名学生#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect()) #查看加载的内容
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
data_name=data_list.map(lambda x:x[0]) #取出列表中的第一项(每个学生的姓名)
#print(data_name.collect())
result_name=data_name.distinct() #对姓名进行去重
print(result_name.collect()) #collect每次都是输出检测是否有结果(result_name是否正常,有内容)
name_count=result_name.count() #对去重之后的姓名个数进行统计,打印出统计个数
print("共有学生{}名".format(name_count))
(2)该系开设多少门课程
print("###该系共开设多少门课程#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
data_course=data_list.map(lambda x:x[1])
#print(data_course.collect())
result_course=data_course.distinct()
print(result_course.collect())
course_count=result_course.count()
print("共开设了{}门课程".format(course_count))
(3)tom的总成绩平均分
print("###tom总成绩平均分#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
Tom_data=data_list.filter(lambda x : 'Tom' in x)#筛选出tom信息
#print(Tom_data.collect())
grade_tom=Tom_data.map(lambda x : int(x[2]))
#在tom信息中把字符串类型的成绩转成int型才能计算
#成绩在列表中的字符串形式,如果要进行计算的话,需转为int型
#print(grade_tom.collect())
regrade=grade_tom.mean() #mean求均值
print("Tom总成绩的平均分为:",regrade)
(4)每名同学选修的课程门数
print("###每名同学选修的课程门数#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
name_data=data_list.map(lambda x : x[0]) #取出第一列(人名)
#print(name_data.collect())
name_data1=name_data.map(lambda x : (x,1))
#把第一列的格式弄成键值对(人名,1),这样后面就方便使用聚合统计次数了,因为每个名字对应一门课程,最后把相同人名的出现次数相加就是该名同学的选修课程总数
#print(name_data1.collect())
name_data2=name_data1.reduceByKey(lambda a,b :a+b)#聚合key值相同的,后面的1相加,最后出来的就是总次数
print(name_data2.collect())#collect以数组方式查看
print("共输出{}项".format(name_data2.count()))
(5)该系Database课程共有多少人选修
print("###该系Database课程共有多少人选修#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
database_data=data_list.map(lambda x : x[1])#取出第二列课程
database_data1=database_data.filter(lambda x : 'DataBase' in x)
database_data2=database_data1.map(lambda x : (x,1))
#print(database_data2.collect())
database_data3=database_data2.reduceByKey(lambda a,b : a+b)
#print(database_data3.collect())
databast_list=database_data3.map(lambda x : x[1])
#print(databast_list.collect())
print("选修database课程的共有{}人".format(databast_list.collect()))
(6)各门课程的平均分是多少
print("###各门课程的平均分是多少#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
course_data=data_list.map(lambda x : (x[1],int(x[2])))
#print(course_data.collect())
course_data2=course_data.map(lambda x :(x[0],[x[1],1]))
course_data1=course_data2.reduceByKey(lambda a,b :[a[0]+b[0],a[1]+b[1]])
print(course_data1.collect())
result_coursemean=course_data1.mapValues(lambda a: a[0]/a[1])
print(result_coursemean.collect())
(7)每位同学的总成绩
print("###每位同学的总成绩#####")
data=sc.textFile("chapter4-data01.txt") #读取文件
#print(data.collect())
data_list=data.map(lambda x:x.split(",")) #以逗号分割,列表化
#print(data_list.collect())
student_data=data_list.map(lambda x : (x[0],int(x[2])))
#print(student_data.collect())
student_data1=student_data.reduceByKey(lambda a,b:a+b)
plt_data=student_data1.collect()
#print(plt_data)
(8)可视化
import matplotlib.pyplot as plt
#画图:展示学生与成绩的关系图
plt.figure("Student_Grade")
#取X,Y
x=list(map(lambda x : x[0],plt_data))
y=list(map(lambda x : x[1],plt_data))
#print(x,y)
#画出条形图bar
plt.bar(x,y,0.5,label="Student_SumGrade")
plt.legend()
plt.show()