Spark DataFrame groupBằng cách sắp xếp theo thứ tự giảm dần (pyspark)


88

Tôi đang sử dụng pyspark (Python 2.7.9 / Spark 1.3.1) và có GroupObject khung dữ liệu mà tôi cần lọc & sắp xếp theo thứ tự giảm dần. Cố gắng đạt được nó thông qua đoạn mã này.

group_by_dataframe.count().filter("`count` >= 10").sort('count', ascending=False)

Nhưng nó ném ra lỗi sau.

sort() got an unexpected keyword argument 'ascending'

Câu trả lời:


166

Trong sortphương thức PySpark 1.3 không có tham số tăng dần. Bạn có thể sử dụng descphương pháp thay thế:

from pyspark.sql.functions import col

(group_by_dataframe
    .count()
    .filter("`count` >= 10")
    .sort(col("count").desc()))

hoặc descchức năng:

from pyspark.sql.functions import desc

(group_by_dataframe
    .count()
    .filter("`count` >= 10")
    .sort(desc("count"))

Cả hai phương pháp đều có thể được sử dụng với Spark> = 1.3 (bao gồm cả Spark 2.x).



22

Cho đến nay, cách thuận tiện nhất là sử dụng:

df.orderBy(df.column_name.desc())

Không yêu cầu nhập khẩu đặc biệt.


Tín dụng cho Daniel Haviv, một Kiến trúc sư Giải pháp tại Databricks, người đã chỉ cho tôi cách này.
gdoron đang hỗ trợ Monica

1
cho đến nay câu trả lời tốt nhất ở đây.
sinh_naked

Thay vào đó, đây phải là câu trả lời được chấp nhận. Đơn giản hơn nhiều và không dựa vào các gói (có lẽ không có sẵn vào thời điểm đó)
Anonymous

Tôi thực sự thích câu trả lời này nhưng không phù hợp với tôi với số đếm trong spark 3.0.0. Tôi nghĩ là vì số đếm là một hàm chứ không phải là một số. TypeError: Đối số không hợp lệ, không phải là một chuỗi hoặc cột: <phương thức liên kết DataFrame.count của DataFrame [...]> thuộc loại <class 'method'>. Đối với các ký tự cột, hãy sử dụng hàm 'lit', 'array', 'struct' hoặc 'create_map'.
Armando

4

Trong pyspark 2.4.4

1) group_by_dataframe.count().filter("`count` >= 10").orderBy('count', ascending=False)

2) from pyspark.sql.functions import desc
   group_by_dataframe.count().filter("`count` >= 10").orderBy('count').sort(desc('count'))

Không cần nhập trong 1) và 1) ngắn gọn và dễ đọc,
vì vậy tôi thích 1) hơn 2)


3

bạn có thể sử dụng groupBy và orderBy như sau

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.