📜  PySpark – orderBy() 和 sort()(1)

📅  最后修改于: 2023-12-03 14:45:52.615000             🧑  作者: Mango

PySpark – orderBy() 和 sort()

在 PySpark 中,要对 DataFrame 进行排序操作可以使用 orderBy() 或者 sort() 函数。两者的作用是相同的,都可以用来对 DataFrame 的列进行升序或降序排列。

orderBy()

orderBy() 函数可以根据指定的列名进行排序,默认情况下按照升序排列。

from pyspark.sql.functions import *
 
# 创建 DataFrame
data = [("Alice", 25), ("Bob", 20), ("Charlie", 30)]
df = spark.createDataFrame(data, ["Name", "Age"])
 
# 对 Age 列进行升序排列
df.orderBy("Age").show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |    Bob| 20|
# |  Alice| 25|
# |Charlie| 30|
# +-------+---+

如果要对多个列进行排序,可以在 orderBy() 函数中指定多个列名,并在每个列名后面指定排序方式。第一列是第一优先级,第二列是第二优先级,以此类推。

# 对 Age 列进行升序排列,相同的 Age 值按 Name 列升序排列
df.orderBy("Age", "Name").show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |    Bob| 20|
# |  Alice| 25|
# |Charlie| 30|
# +-------+---+

可以使用 desc() 函数对列进行降序排列。

# 对 Age 列进行降序排列
df.orderBy(desc("Age")).show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |Charlie| 30|
# |  Alice| 25|
# |    Bob| 20|
# +-------+---+
sort()

sort() 函数与 orderBy() 函数类似,都是用来对 DataFrame 进行排序操作的函数。但是,sort() 函数比 orderBy() 函数更加灵活,可以根据具体的需求使用不同的排序策略。

首先,可以使用 sort() 函数来对保留在 DataFrame 中的所有行进行排序,并返回结果 DataFrame。

# 根据第一列对 DataFrame 进行升序排列
df.sort("_1").show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |  Alice| 25|
# |    Bob| 20|
# |Charlie| 30|
# +-------+---+

也可以将两个 DataFrame 进行连接,然后根据指定的列对连接后的 DataFrame 进行排序。

# 创建第二个 DataFrame
data2 = [(20, "M"), (25, "F"), (30, "M")]
df2 = spark.createDataFrame(data2, ["Age", "Gender"])

# 通过 join 操作将两个 DataFrame 进行连接
joined_df = df.join(df2, "Age")

# 根据 Age 列进行升序排列
joined_df.sort("Age").show()

# +---+------+------+
# |Age|  Name|Gender|
# +---+------+------+
# | 20|   Bob|     M|
# | 25| Alice|     F|
# | 30|Charlie|     M|
# +---+------+------+

还可以根据指定的列对 DataFrame 进行升序或降序排列。

# 根据 Age 列进行升序排列
df.sort(col("Age").asc()).show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |    Bob| 20|
# |  Alice| 25|
# |Charlie| 30|
# +-------+---+

# 根据 Age 列进行降序排列
df.sort(col("Age").desc()).show()

# +-------+---+
# |   Name|Age|
# +-------+---+
# |Charlie| 30|
# |  Alice| 25|
# |    Bob| 20|
# +-------+---+

总的来说,sort() 函数比 orderBy() 函数更加灵活,具有更多的操作选项。但是,在使用 sort() 函数时需要额外注意指定排序策略。