PySpark Window.partitionBy 和 groupBy 两个函数的区别和使用场景

PySpark Window.partitionBy 和 groupBy 两个函数的区别和使用场景

在本文中,我们将介绍 PySpark 中的 Window.partitionBy 和 groupBy 两个函数的区别和使用场景。

阅读更多:PySpark 教程

Window.partitionBy

Window.partitionBy 函数是 PySpark 中的窗口函数,用于对数据进行分组操作,类似于 SQL 中的 PARTITION BY 子句。它可以将数据集按照指定的列进行分组,并为每个分组创建一个子集。在窗口函数之前使用 Window.partitionBy,可以根据指定的列对数据进行分组,然后在每个分组内进行计算。

示例:

假设我们有一个包含以下列的数据集:name、age、gender和salary。我们想要按照 gender 列对数据进行分组,并计算每个分组中的平均薪资。

from pyspark.sql import SparkSession
from pyspark.sql.window import Window
from pyspark.sql.functions import avg

spark = SparkSession.builder.getOrCreate()

# 读取数据集
df = spark.read.csv("data.csv", header=True, inferSchema=True)

# 定义窗口规范
windowSpec = Window.partitionBy("gender")

# 使用窗口函数计算每个分组的平均薪资
df.withColumn("avg_salary", avg("salary").over(windowSpec)).show()

上述代码中,通过 Window.partitionBy(“gender”) 指定了按照 gender 列进行分组,然后使用 avg(“salary”).over(windowSpec) 计算了每个分组内 salary 列的平均值,并将结果添加到了新的一列 “avg_salary” 中。

groupBy

groupBy 函数是 PySpark 中的聚合函数,用于对数据进行分组操作,类似于 SQL 中的 GROUP BY 子句。它可以将数据集按照指定的列进行分组,并对每个分组进行聚合计算。与 Window.partitionBy 不同,groupBy 返回的是一个新的 DataFrame,而不是在原始 DataFrame 中添加新的列。

示例:

假设我们有一个包含以下列的数据集:name、age、gender和salary。我们想要按照 gender 列对数据进行分组,并计算每个分组中的最高薪资。

from pyspark.sql import SparkSession
from pyspark.sql.functions import max

spark = SparkSession.builder.getOrCreate()

# 读取数据集
df = spark.read.csv("data.csv", header=True, inferSchema=True)

# 使用 groupBy 函数计算每个分组的最高薪资
df.groupBy("gender").agg(max("salary").alias("max_salary")).show()

上述代码中,通过 groupBy(“gender”) 指定了按照 gender 列进行分组,然后使用 agg(max(“salary”).alias(“max_salary”)) 计算了每个分组内 salary 列的最大值,并将结果添加到了新的一列 “max_salary” 中。

使用场景

Window.partitionBy 适用于需要在每个分组内进行复杂的计算或对结果进行排序的场景。通过窗口函数,我们可以对每个分组内的数据进行聚合、排序、计数等操作,并将结果作为新的列添加到原始 DataFrame 中。

groupBy 适用于只需要对每个分组进行基本聚合计算的场景。groupBy 返回的是一个新的 DataFrame,可以使用聚合函数对每个分组进行计算,并进行汇总统计。

总结

本文介绍了 PySpark 中的 Window.partitionBy 和 groupBy 两个函数的区别和使用场景。Window.partitionBy 适用于需要在每个分组内进行复杂的计算或排序的场景,可以通过窗口函数对每个分组内的数据进行聚合操作。groupBy 适用于只需要对每个分组进行基本聚合计算的场景,返回的是一个新的 DataFrame。根据具体的需求,我们可以选择合适的函数进行数据分组和聚合操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程