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'

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).



25

Sejauh ini cara yang paling nyaman adalah menggunakan ini:

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

Tidak membutuhkan impor khusus.


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)


4

Anda juga dapat menggunakan groupBy dan orderBy sebagai berikut

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.