Spark DataFrame groupBy et tri dans l'ordre décroissant (pyspark)

88

J'utilise pyspark (Python 2.7.9 / Spark 1.3.1) et j'ai un Dataframe GroupObject dont j'ai besoin pour filtrer et trier dans l'ordre décroissant. Essayer d'y parvenir via ce morceau de code.

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

Mais cela génère l'erreur suivante.

sort() got an unexpected keyword argument 'ascending'
rclakmal
la source

Réponses:

165

Dans PySpark 1.3, la sortméthode ne prend pas de paramètre croissant. Vous pouvez utiliser la descméthode à la place:

from pyspark.sql.functions import col

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

ou descfonction:

from pyspark.sql.functions import desc

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

Les deux méthodes peuvent être utilisées avec avec Spark> = 1.3 (y compris Spark 2.x).

zéro323
la source
22

De loin, le moyen le plus pratique est d'utiliser ceci:

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

Ne nécessite pas d'importations spéciales.

gdoron soutient Monica
la source
Merci à Daniel Haviv, architecte de solutions chez Databricks, qui m'a montré cette voie.
gdoron soutient Monica
1
de loin la meilleure réponse ici.
born_naked
Cela devrait être la réponse acceptée à la place. Beaucoup plus simple et ne repose pas sur les packages (peut-être n'était pas disponible à l'époque)
Anonyme
J'aime vraiment cette réponse mais cela n'a pas fonctionné pour moi avec count in spark 3.0.0. Je pense que c'est parce que le compte est une fonction plutôt qu'un nombre. TypeError: argument non valide, pas une chaîne ou une colonne: <méthode liée DataFrame.count of DataFrame [...]> de type <class 'method'>. Pour les littéraux de colonne, utilisez la fonction «lit», «array», «struct» ou «create_map».
Armando
4

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

Pas besoin d'importer en 1) et 1) est court et facile à lire,
donc je préfère 1) à 2)

Prabhath Kota
la source
3

vous pouvez utiliser groupBy et orderBy comme suit également

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