Я новичок в PySpark и борюсь с простыми манипуляциями с кадрами.У меня есть датафрейм, похожий на:
product period rating product_Desc1 product_Desc2 ..... more columns
a 1 60 foo xx
a 2 70 foo xx
a 3 59 foo xx
b 1 50 bar yy
b 2 55 bar yy
c 1 90 foo bar xy
c 2 100 foo bar xy
Я хотел бы сгруппировать продукт, добавить столбцы для вычисления арифметических, геометрических и гармонических средних рейтингов , сохраняя при этом остальные столбцы в фрейме данных , которые одинаковы для каждого продукта.
Я пытался сделать это с помощью комбинации встроенных функций и UDF.Например:
a_means = df.groupBy("product").agg(mean("rating").alias("a_mean")
g_means = df.groupBy("product").agg(udf_gmean("rating").alias("g_mean")
где:
def g_mean(x):
gm = reduce(mul,x)**(1/len(x))
return gm
udf_gmean = udf(g_mean, FloatType())
Затем я бы соединил выходные данные a_means и g_means с исходным фреймом данных продукта и удалил дубликаты.Тем не менее, этот метод возвращает ошибку, для g_means, утверждая, что «рейтинг» не участвует в groupBy и не является определяемой пользователем функцией агрегирования ....
Я также пытался использовать модуль gmean SciPy, ноЯ получаю сообщение об ошибке, в котором говорится, что ufunc 'log' не подходит для типов ввода, несмотря на то, что, насколько я вижу, все столбцы рейтинга являются целочисленными.
На сайте есть похожие вопросы, но ничегочто я могу найти, что, кажется, решить эту проблему у меня есть.Я был бы очень признателен за помощь, так как она сводит меня с ума!
Заранее спасибо, и я смогу быстро предоставить любую дополнительную информацию сегодня, если я не предоставил достаточно.
Стоит отметитьчто для эффективности я не могу просто преобразовать в Pandas и преобразовать, как я бы сделал это с помощью фрейма данных Pandas ... и я использую Spark 2.2 и не могу обновить!