如何使用 PySpark DataFrame 对多个列进行排序?


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

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

使用 PySpark DataFrame 对多列进行排序的不同方法

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

方法 1:使用 orderBy() 方法

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

语法

以下是使用 Python 中的 orderBy() 方法对 Pyspark DataFrame 的多列进行排序的语法。

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

# Create a SparkSession
spark = SparkSession.builder.getOrCreate()

# Create a sample 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"])

# Order by multiple columns (Age in descending order, Salary in ascending order)
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() 方法

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

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

语法

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

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

参数

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

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

示例

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

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

# Create a SparkSession
spark = SparkSession.builder.getOrCreate()

# Create a sample 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"])

# Sort by multiple columns (Age in ascending order, Salary in descending order)
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() 方法

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

语法

以下是使用 Python 中的 sortWithinPartitions() 方法对 Pyspark DataFrame 的多列进行排序的语法。

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

示例

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

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

# Create a SparkSession
spark = SparkSession.builder.getOrCreate()

# Create a sample 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"])

# Sort within partitions by a column (Age in descending order)
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 提供了多种方法来对 DataFrame 的多列进行排序,包括 orderBy、sort 和 sortWithinPartitions 函数。根据您的用例和数据集的大小,您可以选择最合适的方法。

更新于:2023-08-31

1K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告