Pyspark RDD ReduceByKey Función múltiple

Tengo un DataSrame de PySpark llamado DF con (K, V) pares. Me gustaría aplicar múltiples funciones con ReduceByKey. Por ejemplo, tengo siguientes tres funciones simples:

def sumFunc(a,b): return a+b def maxFunc(a,b): return max(a,b) def minFunc(a,b): return min(a,b) 

Cuando aplico solo una función, por ejemplo, siguiendo tres trabajos:

 DF.reduceByKey(sumFunc) #works DF.reduceByKey(maxFunc) #works DF.reduceByKey(minFunc) #works 

Pero, cuando aplico más de una función, no funciona, por ejemplo, los siguientes no funcionan.

 DF.reduceByKey(sumFunc, maxfunc, minFunc) #it does not work DF.reduceByKey(sumFunc, maxfunc) #it does not work DF.reduceByKey(maxfunc, minFunc) #it does not work DF.reduceByKey(sumFunc, minFunc) #it does not work 

No quiero usar groupByKey porque ralentiza el cálculo.

Si la entrada es un DataFrame solo usa agg :

 import pyspark.sql.functions as sqlf df = sc.parallelize([ ("foo", 1.0), ("foo", 2.5), ("bar", -1.0), ("bar", 99.0) ]).toDF(["k", "v"]) df.groupBy("k").agg(sqlf.min("v"), sqlf.max("v"), sqlf.sum("v")).show() ## +---+------+------+------+ ## | k|min(v)|max(v)|sum(v)| ## +---+------+------+------+ ## |bar| -1.0| 99.0| 98.0| ## |foo| 1.0| 2.5| 3.5| ## +---+------+------+------+ 

Con RDDs puedes usar statcounter :

 from pyspark.statcounter import StatCounter rdd = df.rdd stats = rdd.aggregateByKey( StatCounter(), StatCounter.merge, StatCounter.mergeStats ).mapValues(lambda s: (s.min(), s.max(), s.sum())) stats.collect() ## [('bar', (-1.0, 99.0, 98.0)), ('foo', (1.0, 2.5, 3.5))] 

Usando tus funciones podrías hacer algo como esto:

 def apply(x, y, funs=[minFunc, maxFunc, sumFunc]): return [f(x_, y_) for f, x_, y_ in zip(*(funs, x, y))] rdd.combineByKey(lambda x: (x, x, x), apply, apply).collect() ## [('bar', [-1.0, 99.0, 98.0]), ('foo', [1.0, 2.5, 3.5])]