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'

Відповіді:


166

У 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

Натомість це має бути прийнятою відповіддю. Багато симплерів і не покладаються на пакети (можливо, тоді їх не було)
Анонім

Мені дуже подобається ця відповідь, але у мене не вийшло з підрахунком в іскрі 3.0.0. Я думаю, тому що рахунок - це функція, а не число. TypeError: Недійсний аргумент, а не рядок або стовпець: <метод методу DataFrame.count of DataFrame [...]> типу <class 'method'>. Для літералів стовпців використовуйте функцію 'lit', 'array', 'struct' або 'create_map'.
Армандо

4

У піспарку 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.