pyspark: среднее значение столбца после использования функции фильтра

Я использую следующий код, чтобы получить средний возраст людей, чья зарплата превышает некоторый порог.

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

возраст столбца является числовым (float), но все же я получаю эту ошибку.

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

знаете ли вы какой-либо другой способ получить avg и т. д. без использования groupBy функции и SQL-запросы.

1 ответов


функция агрегации должна быть значением, а имя столбца-ключом:

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

в качестве альтернативы вы можете использовать pyspark.sql.functions:

from pyspark.sql.functions import col, avg

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

также можно использовать CASE .. WHEN

from pyspark.sql.functions import when

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