Spark 2.4 DataFrame分组聚合和窗口函数
简介
Apache Spark是一个强大的分布式计算框架,可以用于处理大规模的数据。Spark提供了多种操作数据的方式,其中DataFrame是一种基于分布式数据集的API,它提供了一种高级的数据操作接口,可以方便地对大规模数据进行分组聚合和窗口函数的处理。
在本文中,我们将介绍Spark 2.4中DataFrame的分组聚合和窗口函数的使用,并通过代码示例演示其用法。
DataFrame分组聚合
DataFrame分组聚合是指对数据根据某个或多个列进行分组,然后对每个分组进行聚合操作,比如求和、平均值、计数等。
下面是一个示例,假设我们有一个包含学生姓名和成绩的DataFrame,我们想要按照学生姓名进行分组,并计算每个学生的平均成绩:
from pyspark.sql import SparkSession
from pyspark.sql.functions import avg
# 创建SparkSession
spark = SparkSession.builder.appName("DataFrame GroupBy and Aggregation").getOrCreate()
# 创建示例DataFrame
data = [("Alice", 80),
("Bob", 90),
("Alice", 85),
("Bob", 95),
("Charlie", 75)]
df = spark.createDataFrame(data, ["name", "score"])
# 分组聚合
df_grouped = df.groupBy("name").agg(avg("score").alias("avg_score"))
# 显示结果
df_grouped.show()
运行以上代码,输出结果如下:
+-------+---------+
| name|avg_score|
+-------+---------+
| Bob| 92.5|
| Alice| 82.5|
|Charlie| 75.0|
+-------+---------+
在上面的代码中,我们首先使用groupBy
方法根据"name"列进行分组,然后使用agg
方法对每个分组进行聚合操作,这里使用了avg
函数计算分组中"score"列的平均值,并将结果重命名为"avg_score"。最后,我们使用show
方法显示结果。
除了平均值之外,还可以使用其他聚合函数,比如求和、最大值、最小值、计数等。只需将对应的函数作为参数传递给agg
方法即可。
窗口函数
除了分组聚合之外,DataFrame还提供了窗口函数的功能,窗口函数是一种特殊的聚合操作,可以对分组后的数据进行更细粒度的处理。
下面是一个示例,假设我们有一个包含学生姓名、成绩和班级的DataFrame,我们想要计算每个学生在班级内的排名:
from pyspark.sql import SparkSession
from pyspark.sql.functions import rank
# 创建SparkSession
spark = SparkSession.builder.appName("DataFrame Window Function").getOrCreate()
# 创建示例DataFrame
data = [("Alice", 80, "A"),
("Bob", 90, "A"),
("Alice", 85, "B"),
("Bob", 95, "B"),
("Charlie", 75, "B")]
df = spark.createDataFrame(data, ["name", "score", "class"])
# 定义窗口规范
window_spec = Window.partitionBy("class").orderBy(col("score").desc())
# 使用窗口函数计算排名
df_ranked = df.withColumn("rank", rank().over(window_spec))
# 显示结果
df_ranked.show()
运行以上代码,输出结果如下:
+-------+-----+-----+----+
| name|score|class|rank|
+-------+-----+-----+----+
| Bob| 95| B| 1|
| Alice| 85| B| 2|
|Charlie| 75| B| 3|
| Bob| 90| A| 1|
| Alice| 80| A| 2|
+-------+-----+-----+----+
在上面的代码中,我们首先使用Window.partitionBy
方法指定窗口的分区规则,这里按照"class"列进行分区。然后使用Window.orderBy
方法指定窗口的排序规则,这里按照"score"列的