Spark DataFrame groupBy e ordina in ordine decrescente (pyspark)


90

Sto usando pyspark (Python 2.7.9 / Spark 1.3.1) e ho un GroupObject del dataframe che devo filtrare e ordinare in ordine decrescente. Sto cercando di ottenerlo tramite questo pezzo di codice.

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

Ma genera il seguente errore.

sort() got an unexpected keyword argument 'ascending'

Risposte:


173

In PySpark 1.3 il sortmetodo non accetta parametri ascendenti. Puoi usare descinvece il metodo:

from pyspark.sql.functions import col

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

o descfunzione:

from pyspark.sql.functions import desc

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

Entrambi i metodi possono essere usati con Spark> = 1.3 (incluso Spark 2.x).



25

Di gran lunga il modo più conveniente è usare questo:

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

Non richiede importazioni speciali.


1
Ringraziamo Daniel Haviv, Solutions Architect di Databricks, che mi ha mostrato questo modo.
gdoron supporterà Monica il

1
di gran lunga la migliore risposta qui.
born_naked

Questa dovrebbe essere invece la risposta accettata. Molto più semplice e non fa affidamento sui pacchetti (forse non era disponibile al momento)
Anonimo

Mi piace molto questa risposta, ma non ha funzionato per me con count in spark 3.0.0. Penso che sia perché il conteggio è una funzione piuttosto che un numero. TypeError: argomento non valido, non una stringa o una colonna: <metodo associato DataFrame.count di DataFrame [...]> di tipo <classe 'metodo'>. Per i valori letterali di colonna, utilizza la funzione "lit", "array", "struct" o "create_map".
Armando

5

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

Non è necessario importare in 1) e 1) è breve e facile da leggere,
quindi preferisco 1) rispetto a 2)


4

puoi anche usare groupBy e orderBy come segue

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.