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'])))