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).
Ответ 2
Использовать orderBy:
group_by_dataframe.count().filter("'count' >= 10").orderBy('count', ascending=False)
http://spark.apache.org/docs/2.0.0/api/python/pyspark.sql.html
Ответ 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"))