Мне нужно рассчитать средние рейтинги фильмов в писпарке - PullRequest
0 голосов
/ 13 октября 2019

У меня есть набор данных / рейтингов фильмов, и мне нужно рассчитать среднее значение рейтингов по фильмам. Это как сумма рейтингов по группам movieId в SQL. Большое спасибо за вашу помощь

Я пытался использовать aggregateBYKey, но я не знаю, как использовать функции seqOp и CombOp. Я новичок в PySpark.

Вот часть моего RDD: [movieId, userId, rating, film]

[('1', '1', 4.0, 'Toy Story (1995)'),
 ('1', '5', 4.0, 'Toy Story (1995)'),
 ('1', '7', 4.5, 'Toy Story (1995)'),
 ('1', '15', 2.5, 'Toy Story (1995)'),
 ('1', '17', 4.5, 'Toy Story (1995)'),
 ('1', '18', 3.5, 'Toy Story (1995)'),
 ('1', '19', 4.0, 'Toy Story (1995)'),
 ('1', '21', 3.5, 'Toy Story (1995)'),
 ('1', '27', 3.0, 'Toy Story (1995)'),
 ('1', '31', 5.0, 'Toy Story (1995)'),
 ('1', '32', 3.0, 'Toy Story (1995)'),
 ('1', '33', 3.0, 'Toy Story (1995)'),
 ('1', '40', 5.0, 'Toy Story (1995)'),
 ('1', '43', 5.0, 'Toy Story (1995)'),
 ('1', '44', 3.0, 'Toy Story (1995)'),
 ('1', '45', 4.0, 'Toy Story (1995)'),
 ('1', '46', 5.0, 'Toy Story (1995)'),
 ('1', '50', 3.0, 'Toy Story (1995)'),
 ('1', '54', 3.0, 'Toy Story (1995)'),
 ('1', '57', 5.0, 'Toy Story (1995)')]

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

[('1', average_ratings_of_film_1, film_name_1),
('2', average_ratings_of_film_2, film_name_2)]

большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 14 октября 2019

Вы можете использовать следующее, чтобы преобразовать ваш список в DF и затем использовать groupby().avg()

data = spark.sparkContext.parallelize(
[('1', '1', 4.0, 'Toy Story (1995)'),
 ('1', '5', 4.0, 'Toy Story (1995)'),
 ('1', '7', 4.5, 'Toy Story (1995)'),
 ('1', '15', 2.5, 'Toy Story (1995)'),
 ('1', '17', 4.5, 'Toy Story (1995)'),
 ('1', '18', 3.5, 'Toy Story (1995)'),
 ('1', '19', 4.0, 'Toy Story (1995)'),
 ('1', '21', 3.5, 'Toy Story (1995)'),
 ('1', '27', 3.0, 'Toy Story (1995)'),
 ('1', '31', 5.0, 'Toy Story (1995)'),
 ('1', '32', 3.0, 'Toy Story (1995)'),
 ('1', '33', 3.0, 'Toy Story (1995)'),
 ('1', '40', 5.0, 'Toy Story (1995)'),
 ('1', '43', 5.0, 'Toy Story (1995)'),
 ('1', '44', 3.0, 'Toy Story (1995)'),
 ('1', '45', 4.0, 'Toy Story (1995)'),
 ('1', '46', 5.0, 'Toy Story (1995)'),
 ('1', '50', 3.0, 'Toy Story (1995)'),
 ('1', '54', 3.0, 'Toy Story (1995)'),
 ('1', '57', 5.0, 'Toy Story (1995)')])

df = data.toDF(schema=["movie_id", "user_id", "rating", "movie"])

group = df.groupby("movie").avg("rating")
group.show()
#+----------------+-----------+
#|           movie|avg(rating)|
#+----------------+-----------+
#|Toy Story (1995)|      3.875|
#+----------------+-----------+
...