Jak obliczyć średnią z kolumny ramki danych i znaleźć 10% najlepszych

13

Jestem bardzo nowy w Scali i Sparkie i pracuję nad własnymi ćwiczeniami z wykorzystaniem statystyk baseballu. Korzystam z klasy przypadków, aby utworzyć RDD i przypisać schemat do danych, a następnie przekształcam go w DataFrame, dzięki czemu mogę używać SparkSQL do wybierania grup graczy poprzez ich statystyki, które spełniają określone kryteria.

Gdy mam już podzbiór graczy, którym jestem zainteresowany, chciałbym znaleźć środek kolumny; np. średnia mrugnięcia lub RBI. Stamtąd chciałbym podzielić wszystkich graczy na grupy percentylowe na podstawie ich średniej wydajności w porównaniu do wszystkich graczy; górne 10%, dolne 10%, 40-50%

Byłem w stanie użyć funkcji DataFrame.describe (), aby zwrócić podsumowanie pożądanej kolumny (średnia, stddev, count, min i max) wszystkie jako ciągi. Czy jest lepszy sposób, aby uzyskać tylko średnią i standardową wartość jako Doubles, i jaki jest najlepszy sposób na podzielenie graczy na grupy 10-percentylowe?

Do tej pory myślę o tym, by znaleźć wartości, które wyznaczają zakresy percentyla i napisać funkcję grupującą graczy za pomocą komparatorów, ale wydaje mi się, że graniczy z ponownym odkrywaniem koła.

Obecnie mam następujący import:

 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
źródło
Czy sprawdziłeś scaladoc ? Ma być przykładem dla średniej i max: .agg(avg(people("salary")), max(people("age"))). Podczas sortowania prawdopodobnie możesz znaleźć (używając skipi take) percentyle, ale mogą być szybsze opcje.
Gábor Bakos
Widziałem to wcześniej w skaladokach. Gdy próbuję użyć ich jak w przykładzie, otrzymuję błąd not found: value avginot found: value max
the3rdNotch
Jakie są twoje przywozy? Pomoc może być łatwiejsza, jeśli istnieje przykład i opisujesz, na czym polegał problem.
Gábor Bakos
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
Poniższy test może pomóc rozpocząć korzystanie z funkcji DataFrame. Wygląda na to, że musisz też zaimportować org.apache.spark.sql.functions._. (BTW .: Myślę, że dodatkowe informacje lepiej dodać do samego pytania i wystarczy dodać komentarz po edycji.)
Gábor Bakos

Odpowiedzi:

21

Oto import, którego potrzebujesz i jak uzyskać średnią dla kolumny o nazwie „RBI”:

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

Odchylenie standardowe - patrz scala - Oblicz odchylenie standardowe zgrupowanych danych w ramce danych Spark - Przepełnienie stosu

Do grupowania według percentyli sugeruję zdefiniowanie nowej kolumny za pomocą funkcji zdefiniowanej przez użytkownika (UDF) i użycie groupBy w tej kolumnie. Widzieć

nealmcb
źródło
4

To także zwraca średnią z kolumny

df.select (mean (df („ColumnName”))). show ()
+ ---------------- +
| śr. (nazwa kolumny) |
+ ---------------- +
| 230,522453845909 |
+ ---------------- +
Erkan ŞİRİN
źródło