web-dev-qa-db-fra.com

PySpark: prendre la moyenne d'une colonne après avoir utilisé la fonction de filtre

J'utilise le code suivant pour obtenir l'âge moyen des personnes dont le salaire est supérieur à un certain seuil.

dataframe.filter(df['salary'] > 100000).agg({"avg": "age"})

l'âge de la colonne est numérique (float) mais je reçois toujours cette erreur.

py4j.protocol.Py4JJavaError: An error occurred while calling o86.agg. 
: scala.MatchError: age (of class Java.lang.String)

Connaissez-vous un autre moyen d'obtenir la moyenne etc. sans utiliser la fonction groupBy et les requêtes SQL.

15
Harit Vishwakarma

La fonction d'agrégation doit être une valeur et un nom de colonne une clé:

dataframe.filter(df['salary'] > 100000).agg({"age": "avg"})

Vous pouvez également utiliser pyspark.sql.functions:

from pyspark.sql.functions import col, avg

dataframe.filter(df['salary'] > 100000).agg(avg(col("age")))

Il est également possible d'utiliser CASE .. WHEN

from pyspark.sql.functions import when

dataframe.select(avg(when(df['salary'] > 100000, df['age'])))
34
zero323