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

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

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

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

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

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

方法1:使用orderBy()方法

按多列对数据框进行排序的第一种方法是使用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()方法

按照多个列对数据帧进行排序的第二种方法是使用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()方法按多个列对数据框进行排序。和之前的示例类似,数据框包含有关个人的信息。然而,这次数据框按照”P_Sex”列的升序和”P_Salary”列的降序排列。输出展示了排序后的数据框,个人信息按照排序条件进行排列。

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()方法

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

语法

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

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提供了多种方法来通过多个列对数据框进行排序,包括orderBy、sort和sortWithinPartitions函数。根据您的用例和数据集的大小,您可以选择最合适的方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程