如何按多列对 PySpark DataFrame 进行排序?

pythonserver side programmingprogramming

处理大型数据集时,一种常见的 PySpark 操作是按多列对 DataFrame 进行排序。当基于多列对数据进行排序时,您可以根据各种标准对排序进行优先排序。使用 PySpark,我们将在本文中介绍几种不同的方法。

在本文中,我们将学习如何按多列对 PysPark DataFrame 进行排序。PySpark 提供了几种对 DataFrame 进行排序的方法,每种方法都提供不同的功能和性能特征,因此让我们深入研究每种方法并了解如何使用它们。

按多列对 PysPark DataFrame 进行排序的不同方法

使用 Python 中的 pyspark,我们可以通过多种方法按多列对数据框进行排序。让我们看看执行此任务的一些常用方法:

方法 1:使用 orderBy() 方法

按多列对数据框进行排序的第一种方法是使用 orderBy() 方法。使用此方法,DataFrame 可以按升序或降序排序。它将一个或多个列的名称作为参数,然后返回具有指定排序顺序的全新 DataFrame。可以使用 pyspark.sql.functions 模块的 desc() 函数指定列的降序。默认情况下,排序顺序设置为升序。该策略提供了一种根据预定部分排列整个 DataFrame 的方法。

语法

以下是使用 Python 中的 orderBy() 方法按多列对 Pyspark 数据框进行排序的语法:

dataframe.orderBy('column1', 'column2', 'column n').show()

参数

  • column1、column2、column n:用于对 DataFrame 进行排序的一个或多个列名或表达式。

  • ascending:(可选)布尔值或布尔值列表,指定每列的排序顺序。默认为 True,表示升序。如果提供了列表,则列表的长度应与要排序的列数相同。

示例

在此示例中,我们使用 PySpark 中的 orderBy() 方法按多列对 DataFrame 进行排序。DataFrame 包含有关个人的信息,包括他们的姓名、年龄、性别、城市和薪水。DataFrame 按"P_Salary"列的降序排列,然后按"P_Name"列的升序排列。输出显示排序后的 DataFrame,并相应显示个人信息。

from pyspark.sql import SparkSession
from pyspark.sql.functions import desc

# 创建 SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建示例 DataFrame
data = [
    ("John", 25, "Male", "New York", 2000),
    ("Emma", 23, "Female", "London", 1800),
    ("Mike", 30, "Male", "Paris", 2500),
    ("Alice", 28, "Female", "Berlin", 2200),
    ("David", 35, "Male", "Tokyo", 3000),
    ("Sophia", 26, "Female", "Sydney", 1900),
    ("Daniel", 32, "Male", "Toronto", 2700),
    ("Olivia", 29, "Female", "Melbourne", 2300),
    ("James", 31, "Male", "Chicago", 2600),
    ("Emily", 27, "Female", "Los Angeles", 2100)
]

df = spark.createDataFrame(data, ["P_Name", "P_Age", "P_Sex", "P_State", "P_Salary"])

# 按多列排序(年龄按降序排列,薪水按升序排列)
df.orderBy(desc("P_Salary"), "P_Name").show()

输出

+------+-----+------+-----------+--------+
|P_Name|P_Age| P_Sex|    P_State|P_Salary|
+------+-----+------+-----------+--------+
| David|   35|  Male|      Tokyo|    3000|
|Daniel|   32|  Male|    Toronto|    2700|
| James|   31|  Male|    Chicago|    2600|
|  Mike|   30|  Male|      Paris|    2500|
|Olivia|   29|Female|  Melbourne|    2300|
| Alice|   28|Female|     Berlin|    2200|
| Emily|   27|Female|Los Angeles|    2100|
|  John|   25|  Male|   New York|    2000|
|Sophia|   26|Female|     Sydney|    1900|
|  Emma|   23|Female|     London|    1800|
+------+-----+------+-----------+--------+

方法 2:使用 sort() 方法

按多列对数据框进行排序的第二种方法是使用 sort() 方法。

使用此方法,DataFrame 会根据一列或多列按升序排序。它至少需要一个段名称作为参数,并返回具有预定排序顺序的另一个 DataFrame。pyspark.sql.functions 模块的 asc() 和 desc() 函数可用于分别指定列的升序或降序。可以使用该方法以多种方式对 DataFrame 进行排序,包括按不同顺序对多个列进行排序。

语法

以下是使用 Python 中的 sort() 方法按多个列对 Pyspark DataFrame 进行排序的语法:

dataframe.sort('column1', 'column2', 'column n', accending=True).show()

参数

  • column1、column2、column n:用于对 DataFrame 进行排序的一个或多个列名或表达式。

  • ascending:(可选)布尔值或布尔值列表,指定每列的排序顺序。升序的默认值为 True。如果提供了列表,则列表的长度应与要排序的列数相同。

示例

在上面的示例中,我们使用 PySpark 中的 sort() 方法按多列对数据框进行排序。与前面的示例类似,DataFrame 包含有关个人的信息。但是,这次 DataFrame 按"P_Sex"列的升序排序,然后按"P_Salary"列的降序排序。输出显示已排序的 DataFrame,其中个人信息根据排序标准排列。

from pyspark.sql import SparkSession
from pyspark.sql.functions import desc

# 创建 SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建示例 DataFrame
data = [
    ("John", 25, "Male", "New York", 2000),
    ("Emma", 23, "Female", "London", 1800),
    ("Mike", 30, "Male", "Paris", 2500),
    ("Alice", 28, "Female", "Berlin", 2200),
    ("David", 35, "Male", "Tokyo", 3000),
    ("Sophia", 26, "Female", "Sydney", 1900),
    ("Daniel", 32, "Male", "Toronto", 2700),
    ("Olivia", 29, "Female", "Melbourne", 2300),
    ("James", 31, "Male", "Chicago", 2600),
    ("Emily", 27, "Female", "Los Angeles", 2100)
]

df = spark.createDataFrame(data, ["P_Name", "P_Age", "P_Sex", "P_State", "P_Salary"])

# 按多列排序(年龄按升序排列,薪水按降序排列)
df.sort(df.P_Sex.asc(), df.P_Salary.desc()).show()

输出

+------+-----+------+-----------+--------+
|P_Name|P_Age| P_Sex|    P_State|P_Salary|
+------+-----+------+-----------+--------+
|Olivia|   29|Female|  Melbourne|    2300|
| Alice|   28|Female|     Berlin|    2200|
| Emily|   27|Female|Los Angeles|    2100|
|Sophia|   26|Female|     Sydney|    1900|
|  Emma|   23|Female|     London|    1800|
| David|   35|  Male|      Tokyo|    3000|
|Daniel|   32|  Male|    Toronto|    2700|
| James|   31|  Male|    Chicago|    2600|
|  Mike|   30|  Male|      Paris|    2500|
|  John|   25|  Male|   New York|    2000|
+------+-----+------+-----------+--------+

方法 3:使用 sortWithinPartitions() 方法

按多列对数据框进行排序的第三种方法是使用 sortWithinPartitions() 方法。使用此方法根据一个或多个列对每个分区内的 DataFrame 进行排序。它返回一个具有每个分区内指定排序顺序的新 DataFrame,并以一个或多个列名作为参数。当需要对每个分区而不是整个 DataFrame 进行单独排序时,这种方法很有用。减少跨分区的数据混洗,使排序过程更加高效。可以使用 asc() 和 desc() 函数指定分区内列的排序顺序。

语法

以下是使用 Python 中的 sortWithinPartitions() 方法按多列对 Pyspark 数据框进行排序的语法:

dataframe.sortWithinPartitions('column1', 'column2', 'column n').show()
  • column1、column2、column n:用于对分区内的 DataFrame 进行排序的一个或多个列名或表达式。

示例

在上面的示例中,我们使用 PySpark 中的 sortWithinPartitions() 方法对数据框数据进行排序。同样,DataFrame 包含有关个人的信息。但是,在这种情况下,DataFrame 根据"P_Age"列按降序在分区内排序。输出显示排序后的 DataFrame,其中个人的信息在分区内分组并按每个分区内的年龄排序。此方法对于优化涉及在分区内而不是整个 DataFrame 内排序的操作很有用。

from pyspark.sql import SparkSession
from pyspark.sql.functions import desc

# 创建 SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建示例 DataFrame
data = [
    ("John", 25, "Male", "New York", 2000),
    ("Emma", 23, "Female", "London", 1800),
    ("Mike", 30, "Male", "Paris", 2500),
    ("Alice", 28, "Female", "Berlin", 2200),
    ("David", 35, "Male", "Tokyo", 3000),
    ("Sophia", 26, "Female", "Sydney", 1900),
    ("Daniel", 32, "Male", "Toronto", 2700),
    ("Olivia", 29, "Female", "Melbourne", 2300),
    ("James", 31, "Male", "Chicago", 2600),
    ("Emily", 27, "Female", "Los Angeles", 2100)
]

df = spark.createDataFrame(data, ["P_Name", "P_Age", "P_Sex", "P_State", "P_Salary"])

# 按列对分区进行排序(按年龄降序排列)
df.sortWithinPartitions(desc("P_Age")).show()

输出

+------+-----+------+-----------+--------+
|P_Name|P_Age| P_Sex|    P_State|P_Salary|
+------+-----+------+-----------+--------+
| David|   35|  Male|      Tokyo|    3000|
|  Mike|   30|  Male|      Paris|    2500|
| Alice|   28|Female|     Berlin|    2200|
|  John|   25|  Male|   New York|    2000|
|  Emma|   23|Female|     London|    1800|
|Daniel|   32|  Male|    Toronto|    2700|
| James|   31|  Male|    Chicago|    2600|
|Olivia|   29|Female|  Melbourne|    2300|
| Emily|   27|Female|Los Angeles|    2100|
|Sophia|   26|Female|     Sydney|    1900|
+------+-----+------+-----------+--------+

结论

PySpark 提供了多种按多列对 DataFrames 进行排序的方法,其中包括 orderBy、sort 和 sortWithinPartitions 函数。根据您的用例和数据集的大小,您可以选择最合适的方法。


相关文章