Cómo calcular la media de una columna de marco de datos y encontrar el 10% superior

13

Soy muy nuevo en Scala y Spark, y estoy trabajando en algunos ejercicios hechos por mí mismo usando estadísticas de béisbol. Estoy usando una clase de caso para crear un RDD y asignar un esquema a los datos, y luego lo estoy convirtiendo en un DataFrame para poder usar SparkSQL para seleccionar grupos de jugadores a través de sus estadísticas que cumplan con ciertos criterios.

Una vez que tenga el subconjunto de jugadores que me interesa buscar más, me gustaría encontrar la media de una columna; por ejemplo, promedio de bateo o carreras impulsadas. A partir de ahí, me gustaría dividir a todos los jugadores en grupos de percentiles en función de su rendimiento promedio en comparación con todos los jugadores; el 10% superior, el 10% inferior, 40-50%

Sin embargo, he podido usar la función DataFrame.describe () para devolver un resumen de una columna deseada (mean, stddev, count, min y max) como cadenas. ¿Hay una mejor manera de obtener solo la media y el estándar como Dobles, y cuál es la mejor manera de dividir a los jugadores en grupos de 10 percentiles?

Hasta ahora, mis pensamientos son encontrar los valores que refuerzan los rangos de percentiles y escribir una función que agrupe a los jugadores a través de comparadores, pero que parece que está bordeando la reinvención de la rueda.

Actualmente tengo las siguientes importaciones:

 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
fuente
¿Has revisado el scaladoc ? Tiene un ejemplo para media y máxima: .agg(avg(people("salary")), max(people("age"))). Con la clasificación, probablemente pueda encontrar (usando skipy take) los percentiles, pero puede haber opciones más rápidas.
Gábor Bakos
Había visto esto anteriormente en los scaladocs. Cuando trato de usarlos como el ejemplo que recibo y error not found: value avgynot found: value max
the3rdNotch
¿Cuáles son tus importaciones? Puede ser más fácil ayudar si hay un ejemplo y usted describe cuál fue el 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
La siguiente prueba puede ayudar a comenzar a usar las funciones de DataFrame. Parece que también tienes que importar el org.apache.spark.sql.functions._. (Por cierto: creo que la información adicional se agrega mejor a la pregunta en sí y es suficiente para agregar un comentario después de la edición.)
Gábor Bakos

Respuestas:

21

Esta es la importación que necesita y cómo obtener la media de una columna llamada "RBI":

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

Para la desviación estándar, vea scala - Calcular la desviación estándar de datos agrupados en un Spark DataFrame - Desbordamiento de pila

Para agrupar por percentiles, sugiero definir una nueva columna a través de una función definida por el usuario (UDF) y usar groupBy en esa columna. Ver

nealmcb
fuente
4

Esto también devuelve el promedio de la columna

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