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  

¿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


4

Esto también devuelve el promedio de la columna

df.select (mean (df ("ColumnName"))). show ()
+ ---------------- +
El | avg (ColumnName) |
+ ---------------- +
| 230.522453845909 |
+ ---------------- +
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.