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'

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).



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.


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)


3

vous pouvez utiliser groupBy et orderBy comme suit également

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.