如何使用 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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告