Spark DataFrame groupBy e classificação em ordem decrescente (pyspark)

88

Estou usando o pyspark (Python 2.7.9 / Spark 1.3.1) e tenho um GroupObject de dataframe que preciso filtrar e classificar em ordem decrescente. Tentar consegui-lo por meio deste pedaço de código.

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

Mas isso gera o seguinte erro.

sort() got an unexpected keyword argument 'ascending'
rclakmal
fonte

Respostas:

165

No sortmétodo PySpark 1.3 não leva parâmetro ascendente. Você pode usar o descmétodo:

from pyspark.sql.functions import col

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

ou descfunção:

from pyspark.sql.functions import desc

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

Ambos os métodos podem ser usados ​​com Spark> = 1.3 (incluindo Spark 2.x).

zero323
fonte
22

De longe, a maneira mais conveniente é usar isto:

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

Não requer importação especial.

gdoron está apoiando Monica
fonte
Crédito para Daniel Haviv, arquiteto de soluções da Databricks, que me mostrou esse caminho.
gdoron está apoiando Monica em
1
de longe a melhor resposta aqui.
born_naked em
Essa deve ser a resposta aceita. Muito mais simples e não depende de pacotes (talvez não estivessem disponíveis na época)
Anônimo
Eu realmente gosto dessa resposta, mas não funcionou para mim com a contagem no spark 3.0.0. Acho que é porque a contagem é uma função e não um número. TypeError: Argumento inválido, não é uma string ou coluna: <método vinculado DataFrame.count of DataFrame [...]> do tipo <classe 'método'>. Para literais de coluna, use a função 'lit', 'array', 'struct' ou 'create_map'.
Armando
4

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

Não há necessidade de importar em 1) e 1) é curto e fácil de ler,
então eu prefiro 1) em vez de 2)

Prabhath Kota
fonte
3

você pode usar groupBy e orderBy da seguinte maneira também

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