Как рассчитать среднее значение столбца данных и найти верхние 10%

13

Я очень новичок в Scala и Spark и работаю над некоторыми самостоятельными упражнениями, используя бейсбольную статистику. Я использую класс наблюдений, создаю RDD и назначаю схему данным, а затем превращаю ее в DataFrame, чтобы я мог использовать SparkSQL для выбора групп игроков по их статистике, которая соответствует определенным критериям.

Как только у меня будет набор игроков, на которых мне интересно посмотреть дальше, я бы хотел найти среднее значение столбца; например, средний уровень или ИКР. Оттуда я хотел бы разбить всех игроков на процентильные группы на основе их средней производительности по сравнению со всеми игроками; верхние 10%, нижние 10%, 40-50%

Я был в состоянии использовать функцию DataFrame.describe (), чтобы вернуть сводку желаемого столбца (mean, stddev, count, min и max), все в виде строк. Есть ли лучший способ получить только среднее и стандартное значение в качестве двойников, и как лучше разбить игроков на группы по 10 процентилей?

Пока что я думаю о том, чтобы найти значения, которые переполняют диапазоны процентилей, и написать функцию, которая группирует игроков с помощью компараторов, но кажется, что она граничит с повторным изобретением колеса.

У меня есть следующий импорт в настоящее время:

 import org.apache.spark.rdd.RDD 
 import org.apache.spark.sql.SQLContext 
 import org.apache.spark.{SparkConf, SparkContext} 
 import org.joda.time.format.DateTimeFormat  
the3rdNotch
источник
Вы проверяли скаладок ? Это есть пример для среднего и макс: .agg(avg(people("salary")), max(people("age"))). С помощью сортировки вы, вероятно, можете найти (используя skipи take) процентили, но возможны более быстрые варианты.
Габор Бакос
Я видел это ранее в скаладоках. Когда я пытаюсь использовать их, как в примере, который я получаю, я получаю сообщение об ошибке not found: value avgиnot found: value max
the3rdNotch
Каков ваш импорт? Может быть легче помочь, если есть пример, и вы описываете, в чем заключалась проблема.
Габор Бакос
import org.apache.spark.rdd.RDD import org.apache.spark.sql.SQLContext import org.apache.spark.{SparkConf, SparkContext} import org.joda.time.format.DateTimeFormat
the3rdNotch
Следующий тест может помочь начать использовать функции DataFrame. Кажется, вы должны импортировать org.apache.spark.sql.functions._тоже. (Кстати: я думаю, что дополнительная информация лучше добавляется к самому вопросу, и достаточно добавить комментарий после редактирования.)
Габор Бакос

Ответы:

21

Это импорт, который вам нужен, и как получить среднее значение для столбца с именем «RBI»:

import org.apache.spark.sql.functions._
df.select(avg($"RBIs")).show()

Стандартное отклонение см. В разделе scala - Расчет стандартного отклонения сгруппированных данных в Spark DataFrame - Переполнение стека.

Для группировки по процентилям я предлагаю определить новый столбец через пользовательскую функцию (UDF) и использовать groupBy для этого столбца. Видеть

nealmcb
источник
4

Это также возвращает среднее значение столбца

df.select (среднее (ДФ ( "ColumnName"))). показать ()
+ ---------------- +
| ср (ColumnName) |
+ ---------------- +
| +230,522453845909 |
+ ---------------- +
Эркан ШИРИН
источник