一、实验目的
(1)熟悉Spark的RDD基本操作及键值对操作;
(2)熟悉使用RDD编程解决实际具体问题的方法。
二、实验平台
操作系统:windows11
mysql版本:8.0
navicat版本:navicat premium 12
三、实验内容
1.pyspark交互式编程
请到教材官网的“下载专区”的“数据集”中下载chapter4-data1.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:
Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure,60 Jim,DataBase,90 Jim,Algorithm,60 Jim,DataStructure,80 …… |
请根据给定的实验数据,在pyspark中通过编程来计算以下内容:
(1)该系总共有多少学生;
sql语句创建表:
表内添加数据:
由于数据没有字段名行,因此修改参数如下:
结果如下:
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少人选修;
(6)各门课程的平均分是多少;
(7)使用累加器计算共有多少人选了DataBase这门课。
2.编写独立应用程序实现数据去重
对于两个输入文件A和B,编写Spark独立应用程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。下面是输入文件和输出文件的一个样例,供参考。
输入文件A的样例如下:
20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z
输入文件B的样例如下:
20170101 y
20170102 y
20170103 x
20170104 z
20170105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z
答:
建表:
将两个数据通过txt文本导入。
3.编写独立应用程序实现求平均值问题
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
答:
导入三个表后计算平均值
所有代码如下:
1. create table sparkstu( id int not null auto_increment, `name` varchar(100), class VARCHAR(100), greades float, PRIMARY key (id) ) SELECT count(DISTINCT name) from sparkstu SELECT count(DISTINCT class) from sparkstu select avg(greades) from sparkstu where `name` = 'Tom'; SELECT name,count(*) from sparkstu GROUP BY(name) SELECT count(*) FROM sparkstu where class = 'DataBase' SELECT class,avg(greades) FROM sparkstu GROUP BY class SELECT sum(case when class = 'DataBase' then 1 else 0 end) FROM sparkstu 2. create table A( id VARCHAR(10) not null, info varchar(5), PRIMARY key(id) ) create table B( id VARCHAR(10) not null, info varchar(5), PRIMARY key(id) ) #union会自动删除重复 CREATE TABLE new_table AS SELECT * FROM A UNION SELECT * FROM B; SELECT * from new_table 3. create table class1( name varchar(100) not null, grade float, PRIMARY KEY(name) ) create table class2( name varchar(100) not null, grade float, PRIMARY KEY(name) ) create table class3( name varchar(100) not null, grade float, PRIMARY KEY(name) ) create table new_table1 as SELECT name,avg(grade) from( SELECT name,grade from class1 union SELECT name,grade from class2 union SELECT name,grade from class3 )as a GROUP BY(name) SELECT * FROM new_table1 |
心得体会:
union使用方法
txt数据导入方法
avg、sum、count使用方法