So berechnen Sie den Mittelwert einer DataFrame-Spalte und ermitteln die besten 10%

13

Ich bin sehr neu in Scala und Spark und arbeite an einigen selbst gemachten Übungen, die Baseballstatistiken verwenden. Ich verwende eine Fallklasse, erstelle eine RDD und ordne den Daten ein Schema zu. Anschließend verwandle ich sie in einen DataFrame, damit ich mithilfe von SparkSQL Gruppen von Spielern anhand ihrer Statistiken auswählen kann, die bestimmte Kriterien erfüllen.

Sobald ich eine Untergruppe von Spielern habe, die ich näher betrachten möchte, möchte ich den Mittelwert einer Spalte ermitteln. zB Batting Average oder RBIs. Von da an möchte ich alle Spieler auf der Grundlage ihrer durchschnittlichen Leistung im Vergleich zu allen Spielern in Perzentilgruppen aufteilen. die oberen 10%, unteren 10%, 40-50%

Ich konnte die DataFrame.describe () - Funktion verwenden, um eine Zusammenfassung einer gewünschten Spalte (Mittelwert, stddev, count, min und max) als Zeichenfolgen zurückzugeben. Gibt es einen besseren Weg, um nur den Mittelwert und den Standardwert als Doppel zu erhalten, und was ist der beste Weg, um die Spieler in Gruppen von 10-Perzentilen zu unterteilen?

Bisher denke ich daran, die Werte zu finden, die die Perzentilbereiche ausmachen, und eine Funktion zu schreiben, die die Spieler über Komparatoren gruppiert, die sich jedoch so anfühlt, als würde sie das Rad neu erfinden.

Ich habe derzeit folgende Importe:

 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
quelle
Hast du den scaladoc überprüft ? Es hat ein Beispiel für mittlere und max: .agg(avg(people("salary")), max(people("age"))). Mit der Sortierung können Sie wahrscheinlich die Perzentile finden (mit skipund take), aber es gibt möglicherweise schnellere Optionen.
Gábor Bakos
Das hatte ich vorher in den scaladocs gesehen. Wenn ich versuche, sie wie im Beispiel zu verwenden, erhalte ich einen Fehler not found: value avgundnot found: value max
the3rdNotch
Was sind Ihre Importe? Es könnte einfacher sein, zu helfen, wenn es ein Beispiel gibt und Sie beschreiben, wo das Problem lag.
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
Mit dem folgenden Test können Sie möglicherweise mit der Verwendung von DataFrame-Funktionen beginnen. Es scheint, dass Sie das auch importieren müssen org.apache.spark.sql.functions._. (Übrigens: Ich denke, die zusätzlichen Informationen werden besser zu der Frage selbst hinzugefügt und es reicht aus, nach der Bearbeitung einen Kommentar hinzuzufügen.)
Gábor Bakos

Antworten:

21

Dies ist der Import, den Sie benötigen, und wie Sie den Mittelwert für eine Spalte mit dem Namen "RBIs" ermitteln:

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

Informationen zur Standardabweichung finden Sie unter scala - Berechnen der Standardabweichung gruppierter Daten in einem Spark-DataFrame - Stapelüberlauf

Für die Gruppierung nach Perzentilen empfehle ich, eine neue Spalte über eine benutzerdefinierte Funktion (UDF) zu definieren und groupBy für diese Spalte zu verwenden. Sehen

Nealmcb
quelle
4

Dies gibt auch den Durchschnitt der Spalte zurück

df.select (mean (df ("ColumnName"))). show ()
+ ---------------- +
| avg (ColumnName) |
+ ---------------- +
230.522453845909
+ ---------------- +
Erkan ŞİRİN
quelle