pyspark dataframe, groupby и изчисляване на дисперсия на колона

Бих искал да групирам по рамка от данни на pyspark и да изчисля дисперсията на конкретна колона. За обикновения човек това е доста лесно и може да се направи по този начин

from pyspark.sql import functions as func
AVERAGES=df.groupby('country').agg(func.avg('clicks').alias('avg_clicks')).collect()

обаче за дисперсията изглежда няма функция за агрегиране във функционалния подмодул (също се чудя защо, тъй като това е доста често срещана операция)


person Luca Fiaschi    schedule 12.08.2015    source източник
comment
И аз не го виждам. Вероятно можете да използвате една от двете класически формули за вариация, директно или като udf. Всички тези нужди са средните и квадратичните операции. Те ви дават средна операция, така че трябва да можете да повдигате на квадрат, например можете да използвате func.pow('clicks',2), за да получите кликвания^2.   -  person Paul    schedule 12.08.2015


Отговори (2)


Това, което можете да направите, е да конвертирате рамката с данни в RDD обект и след това да използвате предоставената функция за отклонение за RDD.

df1 = df.groupby('country').agg(func.avg('clicks').alias('avg_clicks'))
rdd = df1.rdd
rdd.variance()
person Jared    schedule 12.08.2015

Тъй като стандартното отклонение е квадратен корен от дисперсията, чистото решение на PySpark dataframe е:

df = sc.parallelize(((.1, 2.0), (.3, .2))).toDF()
df.show()
varianceDF = df.select(stddev('_1') * stddev('_1'))
varianceDF.show()
person blue-sky    schedule 14.03.2017