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'

Ответы:


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



22

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

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

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


Кредит 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"))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.