Искра проще value_counts

Что-то похожее на Spark — группировка по ключу, затем подсчет по значению позволит мне эмулировать df.series.value_counts() функциональность Pandas в Spark, чтобы:

Результирующий объект будет располагаться в порядке убывания, так что первый элемент будет наиболее часто встречающимся элементом. Исключает значения NA по умолчанию. (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html)

Мне любопытно, нельзя ли сделать это лучше/проще для фреймов данных в Spark.


person Georg Heiler    schedule 21.11.2016    source источник


Ответы (1)


Это просто базовая агрегация, не так ли?

df.groupBy($"value").count.orderBy($"count".desc)

Панды:

import pandas as pd

pd.Series([1, 2, 2, 2, 3, 3, 4]).value_counts()
2    3
3    2
4    1
1    1
dtype: int64

Искра SQL:

Seq(1, 2, 2, 2, 3, 3, 4).toDF("value")
  .groupBy($"value").count.orderBy($"count".desc)
+-----+-----+
|value|count|
+-----+-----+
|    2|    3|
|    3|    2|
|    1|    1|
|    4|    1|
+-----+-----+

Если вы хотите включить дополнительные столбцы группировки (например, «ключ»), просто поместите их в groupBy:

df.groupBy($"key", $"value").count.orderBy($"count".desc)
person zero323    schedule 21.11.2016
comment
Я пытаюсь использовать это в udf, чтобы применить это для каждой строки кадра данных dask, однако, когда я определяю UDF, я получаю ошибку в синтаксисе из-за символа $ - person Eduardo EPF; 15.10.2020