📜  PySpark – GroupBy 并按降序对 DataFrame 进行排序(1)

📅  最后修改于: 2023-12-03 15:04:02.065000             🧑  作者: Mango

PySpark – GroupBy 并按降序对 DataFrame 进行排序

当需要对 Spark DataFrame 进行分组操作并按照某一列进行降序排序时,可以使用 PySpark 的 GroupBy 和排序操作。

以下是代码示例:

首先,我们需要创建一个示例 DataFrame:

from pyspark.sql import SparkSession

# 创建 SparkSession
spark = SparkSession.builder.appName("GroupBy and Sort").getOrCreate()

# 创建一个示例 DataFrame
data = [("Alice", "Maths", 85), ("Bob", "English", 75), ("Charlie", "Science", 90), 
        ("David", "Maths", 84), ("Emma", "Science", 92), ("Frank", "English", 78)]

columns = ["Name", "Subject", "Score"]
df = spark.createDataFrame(data=data, schema=columns)

df.show()

输出结果如下所示:

+-------+-------+-----+
|   Name|Subject|Score|
+-------+-------+-----+
|  Alice|  Maths|   85|
|    Bob|English|   75|
|Charlie|Science|   90|
|  David|  Maths|   84|
|   Emma|Science|   92|
|  Frank|English|   78|
+-------+-------+-----+

接下来,我们可以使用 groupBy() 方法按照学科对 DataFrame 进行分组,然后使用 agg() 方法计算每个组中的平均分数。最后,使用 orderBy() 方法将其按照平均得分降序排列。

from pyspark.sql.functions import avg

# 使用 groupBy() 按照 Subject 列对 DataFrame 进行分组
grouped_df = df.groupBy("Subject")

# 使用 agg() 计算每个组的平均分数
grouped_df_mean = grouped_df.agg(avg("Score").alias("AvgScore"))

# 使用 orderBy() 按照平均分数降序排列
sorted_df = grouped_df_mean.orderBy("AvgScore", ascending=False)

sorted_df.show()

输出结果如下所示:

+-------+--------+
|Subject|AvgScore|
+-------+--------+
|Science|    91.0|
|  Maths|    84.5|
|English|    76.5|
+-------+--------+

我们可以看到,DataFrame 已经按照学科分组,并按照平均分数降序排列。现在,我们已经成功地使用 PySpark 进行了分组和排序操作。