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.