Spark DataFrame groupBy y ordenar en orden descendente (pyspark)


88

Estoy usando pyspark (Python 2.7.9 / Spark 1.3.1) y tengo un GroupObject de marco de datos que necesito filtrar y ordenar en orden descendente. Tratando de lograrlo a través de este código.

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

Pero arroja el siguiente error.

sort() got an unexpected keyword argument 'ascending'

Respuestas:


165

En PySpark 1.3, el sortmétodo no toma un parámetro ascendente. Puedes usar el descmétodo en su lugar:

from pyspark.sql.functions import col

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

o descfunción:

from pyspark.sql.functions import desc

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

Ambos métodos se pueden usar con Spark> = 1.3 (incluido Spark 2.x).



22

De lejos, la forma más conveniente es usar esto:

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

No requiere importaciones especiales.


Gracias a Daniel Haviv, arquitecto de soluciones de Databricks, que me mostró este camino.
gdoron está apoyando a Monica

1
de lejos, la mejor respuesta aquí.
born_naked

En cambio, esta debería ser la respuesta aceptada. Mucho más simple y no depende de paquetes (quizás no estaba disponible en ese momento)
Anónimo

Realmente me gusta esta respuesta, pero no funcionó para mí con count in spark 3.0.0. Creo que se debe a que contar es una función más que un número. TypeError: Argumento no válido, no es una cadena o columna: <método enlazado DataFrame.count of DataFrame [...]> de tipo <clase 'método'>. Para los literales de columna, use la función 'lit', 'array', 'struct' o 'create_map'.
Armando

4

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

No es necesario importar en 1) y 1) es corto y fácil de leer,
así que prefiero 1) sobre 2)


3

también puede usar groupBy y orderBy de la siguiente manera

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.