10道Spark DataFrame程序设计题及Python答案解析
10道Spark DataFrame程序设计题及Python答案解析
本篇博客精选了10道关于Spark DataFrame的程序设计题,并附带详细的Python答案解析,旨在帮助你巩固DataFrame的常用操作,如分组聚合、排序、过滤、窗口函数等。
准备工作
假设你已经安装好了Spark环境,并创建了一个SparkSession对象:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Spark DataFrame Exercises').getOrCreate()
数据集
所有题目都基于以下学生信息数据集:
| 姓名 | 班级 | 成绩 | |---|---|---| | 张三 | 一班 | 80 | | 李四 | 一班 | 75 | | 王五 | 一班 | 90 | | 赵六 | 二班 | 85 | | 孙七 | 二班 | 95 | | 周八 | 二班 | 70 |
你可以使用以下代码创建DataFrame:
data = [('张三', '一班', 80), ('李四', '一班', 75), ('王五', '一班', 90),
('赵六', '二班', 85), ('孙七', '二班', 95), ('周八', '二班', 70)]
df = spark.createDataFrame(data, ['name', 'class', 'score'])
题目及答案
1. 计算每个班级的平均分数。
from pyspark.sql.functions import avg
df.groupBy('class').agg(avg('score')).show()
2. 将成绩大于80分的学生的姓名和成绩输出到一个新的DataFrame中。
df.filter(df.score > 80).select('name', 'score').show()
3. 将成绩按照降序排列并输出前10个学生的姓名和成绩。
df.orderBy(df.score.desc()).select('name', 'score').limit(10).show()
4. 将每个学生的成绩加上10分并输出到一个新的DataFrame中。
df.withColumn('new_score', df.score + 10).select('name', 'new_score').show()
5. 计算每个班级的平均分数并按照升序排列输出。
from pyspark.sql.functions import asc
df.groupBy('class').agg(avg('score')).orderBy(asc('avg(score)')).show()
6. 将每个班级的成绩按照降序排列并输出前5个学生的姓名和成绩。
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy('class').orderBy(df.score.desc())
df.select('name', 'score', 'class', row_number().over(window).alias('rank')).filter('rank <= 5').show()
7. 将每个班级的成绩按照升序排列并输出前5个学生的姓名和成绩。
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy('class').orderBy(df.score.asc())
df.select('name', 'score', 'class', row_number().over(window).alias('rank')).filter('rank <= 5').show()
8. 将每个班级的成绩按照降序排列并输出排名第2到第5的学生的姓名和成绩。
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy('class').orderBy(df.score.desc())
df.select('name', 'score', 'class', row_number().over(window).alias('rank')).filter('rank >= 2 and rank <= 5').show()
9. 将每个班级的成绩按照升序排列并输出排名第2到第5的学生的姓名和成绩。
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy('class').orderBy(df.score.asc())
df.select('name', 'score', 'class', row_number().over(window).alias('rank')).filter('rank >= 2 and rank <= 5').show()
10. 将每个班级的成绩按照降序排列并输出排名第1到第3的学生的姓名和成绩。
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy('class').orderBy(df.score.desc())
df.select('name', 'score', 'class', row_number().over(window).alias('rank')).filter('rank >= 1 and rank <= 3').show()
原文地址: https://www.cveoy.top/t/topic/jnsS 著作权归作者所有。请勿转载和采集!