Médiane / quantiles dans PySpark groupBy
Je voudrais calculer groupe quantiles sur une Étincelle dataframe (à l'aide de PySpark). Soit un approximatif, ou le résultat exact ce serait bien. Je préfère une solution que je peux utiliser dans le cadre de groupBy
/agg
, de sorte que je peux le mélanger avec d'autres PySpark des fonctions d'agrégation. Si ce n'est pas possible pour une raison quelconque, une autre approche pourrait être très bien.
Cette question est lié, mais n'indique pas comment utiliser approxQuantile
comme une fonction d'agrégation.
J'ai aussi accès à la percentile_approx
Ruche de l'UDF, mais je ne sais pas comment l'utiliser comme une fonction d'agrégation.
Par souci de simplicité, supposons que j'ai la suite dataframe:
from pyspark import SparkContext
import pyspark.sql.functions as f
sc = SparkContext()
df = sc.parallelize([
['A', 1],
['A', 2],
['A', 3],
['B', 4],
['B', 5],
['B', 6],
]).toDF(('grp', 'val'))
df_grp = df.groupBy('grp').agg(f.magic_percentile('val', 0.5).alias('med_val'))
df_grp.show()
Résultat attendu est:
+----+-------+
| grp|med_val|
+----+-------+
| A| 2|
| B| 5|
+----+-------+
Comment utiliser approxQuantile par groupe?
OriginalL'auteur abeboparebop | 2017-10-20
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous en avez le plus besoin. Mais le laisser ici pour les générations futures (c'est à dire moi la semaine prochaine si j'oublie).
Ou pour répondre exactement à votre question, cela fonctionne aussi:
Et comme un bonus, vous pouvez passer un tableau de percentiles:
Et vous obtiendrez une liste des en retour.
OriginalL'auteur kael
Puisque vous avez accès à
percentile_approx
, une solution simple serait d'utiliser dans unSQL
commande:groupBy
/agg
à la PySpark niveau (alors que je peux facilement mélanger avec d'autres PySpark fonctions d'agrégation).Je ne crois qu'il est possible d'utiliser seulement
groupBy
etagg
, toutefois, pour utiliser une fenêtre de base de l'approche devrait également fonctionner.J'ai clarifié ma solution idéale dans la question. Clairement cette réponse fait le travail, mais ce n'est pas tout à fait ce que je veux. Je vais laisser la question ouverte pour quelques temps pour voir si un nettoyeur de réponse.
OriginalL'auteur Shaido
Malheureusement, et au meilleur de ma connaissance, il semble qu'il n'est pas possible de le faire avec "pure" PySpark commandes (la solution par Shaido fournit une solution de contournement avec SQL), et la raison en est très simple: en contraste avec les autres fonctions d'agrégation, comme
mean
,approxQuantile
ne renvoie pas unColumn
type, mais un liste.Nous allons voir un exemple rapide avec vos données d'échantillonnage:
Je doute qu'une fenêtre de l'approche fondée sur le fait aucune différence, puisque comme je l'ai dit la raison sous-jacente est très élémentaire.
Voir aussi ma réponse ici pour plus de détails.
OriginalL'auteur desertnaut