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
la source
.agg(avg(people("salary")), max(people("age")))
. Avec le tri, vous pouvez probablement trouver (en utilisantskip
ettake
) les centiles, mais il pourrait y avoir des options plus rapides.not found: value avg
etnot found: value max
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.joda.time.format.DateTimeFormat
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.)Réponses:
Voici l'importation dont vous avez besoin et comment obtenir la moyenne d'une colonne nommée "RBI":
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
la source
Ceci renvoie également la moyenne de la colonne
la source