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'
rclakmal
fuente

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

zero323
fuente
22

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

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

No requiere importaciones especiales.

gdoron está apoyando a Monica
fuente
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)

Prabhath Kota
fuente
3

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

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