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|
+----+-------+
Je pense que vous pourriez être en mesure de rouler dans cette instance à l'aide de la sous-jacentes rdd et un algorithme pour le calcul distribué quantiles par exemple, ici et les liens qui y sont. En fait, le github rapport a certains pyspark exemples.
Comment utiliser approxQuantile par groupe?

OriginalL'auteur abeboparebop | 2017-10-20