Spark DataFrame groupBy и сортировать в порядке убывания (pyspark)

Я использую pyspark (Python 2.7.9/Spark 1.3.1) и имею DataFrame GroupObject, который мне нужно фильтровать и сортировать в порядке убывания. Попытка добиться этого через этот кусок кода.

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

Но это вызывает следующую ошибку.

sort() got an unexpected keyword argument 'ascending'

Ответ 1

В методе sort PySpark 1.3 не применяется восходящий параметр. Вместо этого вы можете использовать метод desc:

from pyspark.sql.functions import col

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

или desc:

from pyspark.sql.functions import desc

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

Оба метода можно использовать с Spark> = 1.3 (включая Spark 2.x).

Ответ 3

Как и выше, но сортировка по имени столбца с переименованием (псевдоним):

 from pyspark.sql.functions import desc

 df=df.count().withColumnRenamed("count", "newColName")\
      .filter("'count' >= 10")
      .sort(desc("newColName"))
 df.show()

Ответ 4

Как получить последовательный идентификатор столбца:

from pyspark.sql.functions import desc, row_number, monotonically_increasing_id



df_with_seq_id = df.withColumn('index_column_name', row_number().over(Window.orderBy(monotonically_increasing_id())) - 1)

Обратите внимание, что row_number() начинается с 1, поэтому вычтите на 1, если вы хотите 0-индексированный столбец

Ответ 5

Вы также можете использовать groupBy и orderBy следующим образом

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