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.