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

88

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

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

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

sort() got an unexpected keyword argument 'ascending'
rclakmal
источник

Ответы:

165

В PySpark 1.3 sortметод не принимает восходящий параметр. 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).

ноль323
источник
22

Безусловно, самый удобный способ - использовать это:

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

Не требует специального импорта.

gdoron поддерживает Монику
источник
Кредит Daniel Хавив Solutions Architect в Databricks , который показал мне этот путь.
gdoron поддерживает Монику
1
безусловно, лучший ответ здесь.
born_naked
Вместо этого это должен быть принятый ответ. Намного проще и не полагается на пакеты (возможно, в то время не было доступно)
Аноним
Мне очень нравится этот ответ, но у меня не получилось с count в Spark 3.0.0. Я думаю, это потому, что счетчик - это функция, а не число. TypeError: недопустимый аргумент, а не строка или столбец: <связанный метод DataFrame.count из DataFrame [...]> типа <class 'method'>. Для литералов столбцов используйте функцию "lit", "array", "struct" или "create_map".
Армандо
4

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

Нет необходимости импортировать в 1) и 1) кратко и легко читается,
поэтому я предпочитаю 1) 2)

Прабхат Кота
источник
3

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

dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
Нарендра Мару
источник