2018-05-25 gt-day 问题答案参考–Spark

[1]:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
[2]:
spark = SparkSession.builder.getOrCreate()
[3]:
# 读取源数据
df = spark.read.csv('/Users/cjh/Downloads/demo_data.csv', header=True)
df.show(n=100)
+---------+----+-------+----+
|     学年|学号|   科目|分数|
+---------+----+-------+----+
|2011-2012|   1|Chinese|  97|
|2011-2012|   2|Chinese|  80|
|2011-2012|   3|Chinese|  85|
|2011-2012|   4|Chinese|  86|
|2011-2012|   5|Chinese|  91|
|2011-2012|   6|Chinese|  79|
|2011-2012|   7|Chinese|  91|
|2011-2012|   1|English|  70|
|2011-2012|   2|English|  80|
|2011-2012|   3|English|  94|
|2011-2012|   4|English|  72|
|2011-2012|   5|English|  94|
|2011-2012|   6|English|  96|
|2011-2012|   7|English|  77|
|2011-2012|   1|   math|  72|
|2011-2012|   2|   math|  90|
|2011-2012|   3|   math|  89|
|2011-2012|   5|   math|  72|
|2011-2012|   6|   math|  91|
|2011-2012|   7|   math|  66|
|2011-2012|   4|   math|  60|
|2012-2013|   6|Chinese|  95|
|2012-2013|   1|Chinese|  85|
|2012-2013|   7|Chinese|  83|
|2012-2013|   3|Chinese|  78|
|2012-2013|   2|Chinese|  76|
|2012-2013|   5|Chinese|  76|
|2012-2013|   4|Chinese|  72|
|2012-2013|   5|English|  95|
|2012-2013|   2|English|  91|
|2012-2013|   6|English|  90|
|2012-2013|   4|English|  86|
|2012-2013|   3|English|  78|
|2012-2013|   1|English|  72|
|2012-2013|   7|English|  72|
|2012-2013|   5|   math|  94|
|2012-2013|   7|   math|  94|
|2012-2013|   3|   math|  92|
|2012-2013|   4|   math|  89|
|2012-2013|   1|   math|  88|
|2012-2013|   2|   math|  76|
|2012-2013|   6|   math|  70|
+---------+----+-------+----+

[4]:
# spark Dataframe的排序默认为升序

# 学生每一门课程的历史最高分数(长格式)
df.groupBy('学号', '科目').agg(F.max('分数').alias('最高分')).sort('学号').show(n=100)
+----+-------+------+
|学号|   科目|最高分|
+----+-------+------+
|   1|English|    72|
|   1|   math|    88|
|   1|Chinese|    97|
|   2|Chinese|    80|
|   2|English|    91|
|   2|   math|    90|
|   3|   math|    92|
|   3|Chinese|    85|
|   3|English|    94|
|   4|English|    86|
|   4|   math|    89|
|   4|Chinese|    86|
|   5|Chinese|    91|
|   5|   math|    94|
|   5|English|    95|
|   6|Chinese|    95|
|   6|English|    96|
|   6|   math|    91|
|   7|Chinese|    91|
|   7|English|    77|
|   7|   math|    94|
+----+-------+------+

[5]:
# 学生每一门课程的历史最高分数(宽格式)
df.groupBy('学号').pivot('科目', values=['Chinese', 'English', 'math']).agg(F.max('分数')).sort('学号').show()
+----+-------+-------+----+
|学号|Chinese|English|math|
+----+-------+-------+----+
|   1|     97|     72|  88|
|   2|     80|     91|  90|
|   3|     85|     94|  92|
|   4|     86|     86|  89|
|   5|     91|     95|  94|
|   6|     95|     96|  91|
|   7|     91|     77|  94|
+----+-------+-------+----+

[6]:
# 以学年, 学号, 科目排序
df.sort('学年', '学号', '科目').show(n=100)
+---------+----+-------+----+
|     学年|学号|   科目|分数|
+---------+----+-------+----+
|2011-2012|   1|Chinese|  97|
|2011-2012|   1|English|  70|
|2011-2012|   1|   math|  72|
|2011-2012|   2|Chinese|  80|
|2011-2012|   2|English|  80|
|2011-2012|   2|   math|  90|
|2011-2012|   3|Chinese|  85|
|2011-2012|   3|English|  94|
|2011-2012|   3|   math|  89|
|2011-2012|   4|Chinese|  86|
|2011-2012|   4|English|  72|
|2011-2012|   4|   math|  60|
|2011-2012|   5|Chinese|  91|
|2011-2012|   5|English|  94|
|2011-2012|   5|   math|  72|
|2011-2012|   6|Chinese|  79|
|2011-2012|   6|English|  96|
|2011-2012|   6|   math|  91|
|2011-2012|   7|Chinese|  91|
|2011-2012|   7|English|  77|
|2011-2012|   7|   math|  66|
|2012-2013|   1|Chinese|  85|
|2012-2013|   1|English|  72|
|2012-2013|   1|   math|  88|
|2012-2013|   2|Chinese|  76|
|2012-2013|   2|English|  91|
|2012-2013|   2|   math|  76|
|2012-2013|   3|Chinese|  78|
|2012-2013|   3|English|  78|
|2012-2013|   3|   math|  92|
|2012-2013|   4|Chinese|  72|
|2012-2013|   4|English|  86|
|2012-2013|   4|   math|  89|
|2012-2013|   5|Chinese|  76|
|2012-2013|   5|English|  95|
|2012-2013|   5|   math|  94|
|2012-2013|   6|Chinese|  95|
|2012-2013|   6|English|  90|
|2012-2013|   6|   math|  70|
|2012-2013|   7|Chinese|  83|
|2012-2013|   7|English|  72|
|2012-2013|   7|   math|  94|
+---------+----+-------+----+

[7]:
# 以学年,  科目, 学号排序
df.sort('学年', '科目', '学号').show(n=100)
+---------+----+-------+----+
|     学年|学号|   科目|分数|
+---------+----+-------+----+
|2011-2012|   1|Chinese|  97|
|2011-2012|   2|Chinese|  80|
|2011-2012|   3|Chinese|  85|
|2011-2012|   4|Chinese|  86|
|2011-2012|   5|Chinese|  91|
|2011-2012|   6|Chinese|  79|
|2011-2012|   7|Chinese|  91|
|2011-2012|   1|English|  70|
|2011-2012|   2|English|  80|
|2011-2012|   3|English|  94|
|2011-2012|   4|English|  72|
|2011-2012|   5|English|  94|
|2011-2012|   6|English|  96|
|2011-2012|   7|English|  77|
|2011-2012|   1|   math|  72|
|2011-2012|   2|   math|  90|
|2011-2012|   3|   math|  89|
|2011-2012|   4|   math|  60|
|2011-2012|   5|   math|  72|
|2011-2012|   6|   math|  91|
|2011-2012|   7|   math|  66|
|2012-2013|   1|Chinese|  85|
|2012-2013|   2|Chinese|  76|
|2012-2013|   3|Chinese|  78|
|2012-2013|   4|Chinese|  72|
|2012-2013|   5|Chinese|  76|
|2012-2013|   6|Chinese|  95|
|2012-2013|   7|Chinese|  83|
|2012-2013|   1|English|  72|
|2012-2013|   2|English|  91|
|2012-2013|   3|English|  78|
|2012-2013|   4|English|  86|
|2012-2013|   5|English|  95|
|2012-2013|   6|English|  90|
|2012-2013|   7|English|  72|
|2012-2013|   1|   math|  88|
|2012-2013|   2|   math|  76|
|2012-2013|   3|   math|  92|
|2012-2013|   4|   math|  89|
|2012-2013|   5|   math|  94|
|2012-2013|   6|   math|  70|
|2012-2013|   7|   math|  94|
+---------+----+-------+----+

[28]:
# 以学年,  科目, 分数
df.sort('学年', '科目', '分数').show(n=100)
+---------+----+-------+----+
|     学年|学号|   科目|分数|
+---------+----+-------+----+
|2011-2012|   6|Chinese|  79|
|2011-2012|   2|Chinese|  80|
|2011-2012|   3|Chinese|  85|
|2011-2012|   4|Chinese|  86|
|2011-2012|   5|Chinese|  91|
|2011-2012|   7|Chinese|  91|
|2011-2012|   1|Chinese|  97|
|2011-2012|   1|English|  70|
|2011-2012|   4|English|  72|
|2011-2012|   7|English|  77|
|2011-2012|   2|English|  80|
|2011-2012|   3|English|  94|
|2011-2012|   5|English|  94|
|2011-2012|   6|English|  96|
|2011-2012|   4|   math|  60|
|2011-2012|   7|   math|  66|
|2011-2012|   5|   math|  72|
|2011-2012|   1|   math|  72|
|2011-2012|   3|   math|  89|
|2011-2012|   2|   math|  90|
|2011-2012|   6|   math|  91|
|2012-2013|   4|Chinese|  72|
|2012-2013|   2|Chinese|  76|
|2012-2013|   5|Chinese|  76|
|2012-2013|   3|Chinese|  78|
|2012-2013|   7|Chinese|  83|
|2012-2013|   1|Chinese|  85|
|2012-2013|   6|Chinese|  95|
|2012-2013|   1|English|  72|
|2012-2013|   7|English|  72|
|2012-2013|   3|English|  78|
|2012-2013|   4|English|  86|
|2012-2013|   6|English|  90|
|2012-2013|   2|English|  91|
|2012-2013|   5|English|  95|
|2012-2013|   6|   math|  70|
|2012-2013|   2|   math|  76|
|2012-2013|   1|   math|  88|
|2012-2013|   4|   math|  89|
|2012-2013|   3|   math|  92|
|2012-2013|   5|   math|  94|
|2012-2013|   7|   math|  94|
+---------+----+-------+----+

[ ]: