Comment calculer la moyenne d'une colonne de trame de données et trouver les 10% supérieurs

13

Je suis très nouveau sur Scala et Spark, et je travaille sur des exercices autodidactes utilisant des statistiques de baseball. J'utilise une classe de cas pour créer un RDD et attribuer un schéma aux données, puis je le transforme en DataFrame afin que je puisse utiliser SparkSQL pour sélectionner des groupes de joueurs via leurs statistiques qui répondent à certains critères.

Une fois que j'ai le sous-ensemble de joueurs que je suis intéressé à regarder plus loin, je voudrais trouver la moyenne d'une colonne; par exemple Batting Average ou RBIs. À partir de là, je voudrais diviser tous les joueurs en groupes centiles en fonction de leurs performances moyennes par rapport à tous les joueurs; le top 10%, le bas 10%, 40-50%

J'ai cependant pu utiliser la fonction DataFrame.describe () pour renvoyer un résumé d'une colonne souhaitée (moyenne, stddev, count, min et max), sous forme de chaînes. Existe-t-il un meilleur moyen d'obtenir uniquement la moyenne et le stddev en double, et quelle est la meilleure façon de diviser les joueurs en groupes de 10 centiles?

Jusqu'à présent, mes pensées sont de trouver les valeurs qui réduisent les plages de percentiles et d'écrire une fonction qui regroupe les joueurs via des comparateurs, mais cela semble être à la limite de réinventer la roue.

J'ai actuellement les importations suivantes:

 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 source
Avez-vous vérifié le scaladoc ? Il a un exemple pour la moyenne et max: .agg(avg(people("salary")), max(people("age"))). Avec le tri, vous pouvez probablement trouver (en utilisant skipet take) les centiles, mais il pourrait y avoir des options plus rapides.
Gábor Bakos
J'avais déjà vu cela dans les scaladocs. Lorsque j'essaie de les utiliser comme l'exemple que je reçois et erreur not found: value avgetnot found: value max
the3rdNotch
Quelles sont vos importations? Il pourrait être plus facile de vous aider s'il existe un exemple et que vous décrivez le problème.
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
Le test suivant peut aider à commencer à utiliser les fonctions DataFrame. Il semble que vous deviez aussi importer org.apache.spark.sql.functions._. (BTW .: Je pense que les informations supplémentaires sont mieux ajoutées à la question elle-même et il suffit d'ajouter un commentaire après modification.)
Gábor Bakos

Réponses:

21

Voici l'importation dont vous avez besoin et comment obtenir la moyenne d'une colonne nommée "RBI":

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

Pour l'écart type, voir scala - Calculer l'écart type des données groupées dans un Spark DataFrame - Stack Overflow

Pour le regroupement par centiles, je suggère de définir une nouvelle colonne via une fonction définie par l'utilisateur (UDF) et d'utiliser groupBy sur cette colonne. Voir

nealmcb
la source
4

Ceci renvoie également la moyenne de la colonne

df.select (mean (df ("ColumnName"))). show ()
+ ---------------- +
| avg (ColumnName) |
+ ---------------- +
| 230,522453845909 |
+ ---------------- +
Erkan ŞİRİN
la source