Spark DataFrame groupBy i sortuj w kolejności malejącej (pyspark)

88

Używam pyspark (Python 2.7.9 / Spark 1.3.1) i mam Dataframe GroupObject, którą muszę filtrować i sortować w kolejności malejącej. Próbuję to osiągnąć za pomocą tego fragmentu kodu.

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

Ale generuje następujący błąd.

sort() got an unexpected keyword argument 'ascending'
rclakmal
źródło

Odpowiedzi:

165

W PySpark 1.3 sortmetoda nie przyjmuje parametru rosnącego. Zamiast tego możesz użyć descmetody:

from pyspark.sql.functions import col

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

lub descfunkcja:

from pyspark.sql.functions import desc

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

Obie metody mogą być używane z Spark> = 1.3 (w tym Spark 2.x).

zero323
źródło
22

Zdecydowanie najwygodniejszym sposobem jest użycie tego:

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

Nie wymaga specjalnego importu.

gdoron wspiera Monikę
źródło
Podziękowania dla Daniela Haviva, architekta rozwiązań w Databricks, który pokazał mi w ten sposób.
gdoron wspiera Monikę
1
zdecydowanie najlepsza odpowiedź tutaj.
born_naked
Zamiast tego powinna to być akceptowana odpowiedź. Znacznie prostszy i nie polega na pakietach (być może nie był wtedy dostępny)
Anonimowy
Naprawdę podoba mi się ta odpowiedź, ale nie działała dla mnie z count w Spark 3.0.0. Myślę, że jest tak, ponieważ liczba jest funkcją, a nie liczbą. TypeError: Invalid argument, not a string or column: <bound method DataFrame.count of DataFrame [...]> of type <class 'method'>. W przypadku literałów kolumnowych użyj funkcji „lit”, „array”, „struct” lub „create_map”.
Armando
4

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

Nie ma potrzeby importowania w 1) i 1) jest krótkie i łatwe do odczytania,
więc wolę 1) powyżej 2)

Prabhath Kota
źródło
3

możesz również użyć groupBy i orderBy w następujący sposób

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Narendra Maru
źródło