Come calcolare la media di una colonna del frame di dati e trovare il 10% superiore


13

Sono molto nuovo di Scala e Spark e sto lavorando ad alcuni esercizi fatti da sé usando le statistiche del baseball. Sto usando una classe di casi per creare un RDD e assegnare uno schema ai dati, quindi lo sto trasformando in un DataFrame in modo da poter usare SparkSQL per selezionare gruppi di giocatori attraverso le loro statistiche che soddisfano determinati criteri.

Una volta che ho il sottogruppo di giocatori che sono interessato a guardare oltre, vorrei trovare la media di una colonna; ad es. media battuta o RBI. Da lì vorrei suddividere tutti i giocatori in gruppi percentili in base alla loro performance media rispetto a tutti i giocatori; il 10% superiore, il 10% inferiore, il 40-50%

Sono stato in grado di utilizzare la funzione DataFrame.describe () per restituire un riepilogo di una colonna desiderata (media, stddev, count, min e max) tutti come stringhe. C'è un modo migliore per ottenere solo la media e lo stddev come Doppio, e qual è il modo migliore di suddividere i giocatori in gruppi di 10 percentili?

Finora il mio pensiero è quello di trovare i valori che regolano gli intervalli percentili e scrivere una funzione che raggruppa i giocatori tramite i comparatori, ma sembra che stia confinando con il reinventare la ruota.

Attualmente ho le seguenti importazioni:

 import org.apache.spark.rdd.RDD 
 import org.apache.spark.sql.SQLContext 
 import org.apache.spark.{SparkConf, SparkContext} 
 import org.joda.time.format.DateTimeFormat  

Hai controllato lo scaladoc ? Ha un esempio per media e massima: .agg(avg(people("salary")), max(people("age"))). Con l'ordinamento probabilmente puoi trovare (usando skipe take) i percentili, ma potrebbero esserci opzioni più veloci.
Gábor Bakos,

L'avevo visto in precedenza negli scaladoc. Quando provo ad usarli come nell'esempio che ricevo ed errore not found: value avgenot found: value max
the3rdNotch

Quali sono le tue importazioni? Potrebbe essere più semplice aiutare se c'è un esempio e descrivi quale fosse il problema.
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

Il seguente test potrebbe aiutare a iniziare a usare le funzioni DataFrame. Sembra che anche tu debba importare org.apache.spark.sql.functions._. (A proposito: penso che le informazioni aggiuntive siano meglio aggiunte alla domanda stessa ed è sufficiente aggiungere un commento dopo la modifica.)
Gábor Bakos

Risposte:


21

Questa è l'importazione di cui hai bisogno e come ottenere la media per una colonna denominata "RBIs":

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

Per la deviazione standard, vedere scala - Calcola la deviazione standard dei dati raggruppati in un Spark DataFrame - StackTranslate.it

Per il raggruppamento per percentili, suggerisco di definire una nuova colonna tramite una funzione definita dall'utente (UDF) e di utilizzare GroupBy su quella colonna. Vedere


4

Ciò restituisce anche la media della colonna

df.select (media (df ( "ColumnName"))). show ()
+ ---------------- +
| avg (ColumnName) |
+ ---------------- +
| 230,522453845909 |
+ ---------------- +
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.