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'
rclakmal
quelle

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.

null323
quelle
22

Der mit Abstand bequemste Weg ist dies:

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

Erfordert keine speziellen Importe.

Gdoron unterstützt Monica
quelle
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)

Prabhath Kota
quelle
3

Sie können groupBy und orderBy auch wie folgt verwenden

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