Spark DataFrame groupBy und sortiere in absteigender Reihenfolge (pyspark)


88

Ich verwende pyspark (Python 2.7.9 / Spark 1.3.1) und habe einen Datenrahmen GroupObject, den ich in absteigender Reihenfolge filtern und sortieren muss. Der Versuch, dies über diesen Code zu erreichen.

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

Es wird jedoch der folgende Fehler ausgegeben.

sort() got an unexpected keyword argument 'ascending'

Antworten:


165

In PySpark 1.3 akzeptiert die sortMethode keine aufsteigenden Parameter. Sie können descstattdessen die Methode verwenden:

from pyspark.sql.functions import col

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

oder descFunktion:

from pyspark.sql.functions import desc

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

Beide Methoden können mit Spark> = 1.3 (einschließlich Spark 2.x) verwendet werden.



22

Der mit Abstand bequemste Weg ist dies:

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

Erfordert keine speziellen Importe.


Dank an Daniel Haviv, einen Lösungsarchitekten bei Databricks, der mir diesen Weg gezeigt hat.
Gdoron unterstützt Monica

1
bei weitem die beste Antwort hier.
born_naked

Dies sollte stattdessen die akzeptierte Antwort sein. Viel einfacher und nicht auf Pakete angewiesen (vielleicht war es zu diesem Zeitpunkt noch nicht verfügbar)
Anonym

Ich mag diese Antwort wirklich, habe aber mit count in spark 3.0.0 nicht für mich gearbeitet. Ich denke, das liegt daran, dass count eher eine Funktion als eine Zahl ist. TypeError: Ungültiges Argument, keine Zeichenfolge oder Spalte: <gebundene Methode DataFrame.count of DataFrame [...]> vom Typ <Klasse 'Methode'>. Verwenden Sie für Spaltenliterale die Funktionen 'lit', 'array', 'struct' oder 'create_map'.
Armando

4

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

Keine Notwendigkeit zum Importieren in 1) und 1) ist kurz und leicht zu lesen,
daher bevorzuge ich 1) gegenüber 2)


3

Sie können groupBy und orderBy auch wie folgt verwenden

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.