Spark DataFrame groupBy dan urutkan dalam urutan menurun (pyspark)

90

Saya menggunakan pyspark (Python 2.7.9 / Spark 1.3.1) dan memiliki GroupObject dataframe yang perlu saya filter & urutkan dalam urutan menurun. Mencoba mencapainya melalui potongan kode ini.

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

Tapi itu melempar kesalahan berikut.

sort() got an unexpected keyword argument 'ascending'
rclakmal.dll
sumber

Jawaban:

173

Dalam sortmetode PySpark 1.3 tidak mengambil parameter ascending. Anda dapat menggunakan descmetode sebagai gantinya:

from pyspark.sql.functions import col

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

atau descfungsi:

from pyspark.sql.functions import desc

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

Kedua metode dapat digunakan dengan Spark> = 1.3 (termasuk Spark 2.x).

nol323
sumber
25

Sejauh ini cara yang paling nyaman adalah menggunakan ini:

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

Tidak membutuhkan impor khusus.

gdoron mendukung Monica
sumber
1
Penghargaan untuk Daniel Haviv, Arsitek Solusi di Databricks yang menunjukkan cara ini kepada saya.
gdoron mendukung Monica
1
sejauh ini jawaban terbaik di sini.
born_naked
Ini harus menjadi jawaban yang diterima sebagai gantinya. Jauh lebih cepat dan tidak bergantung pada paket (mungkin tidak tersedia pada saat itu)
Anonim
Saya sangat menyukai jawaban ini tetapi tidak berhasil untuk saya dengan hitungan di percikan 3.0.0. Saya pikir itu karena hitungan adalah fungsi daripada angka. TypeError: Argumen tidak valid, bukan string atau kolom: <metode terikat DataFrame.count dari DataFrame [...]> tipe <class 'method'>. Untuk literal kolom, gunakan fungsi 'lit', 'array', 'struct' atau 'create_map'.
Armando
5

Di 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'))

Tidak perlu mengimpor dalam 1) dan 1) pendek & mudah dibaca,
Jadi saya lebih suka 1) daripada 2)

Prabhath Kota
sumber
4

Anda juga dapat menggunakan groupBy dan orderBy sebagai berikut

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Narendra Maru
sumber