【问题标题】:I need to calculate the average ratings of films in pyspark我需要计算 pyspark 中电影的平均收视率
【发布时间】:2019-10-13 16:03:50
【问题描述】:

我有一组电影数据/收视率,我需要计算电影收视率的平均值。这就像 SQL 中的评级 groupby movieId 的总和。 非常感谢您的帮助

我尝试使用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)]

非常感谢您的帮助

【问题讨论】:

  • 你可以做groupby并取平均df.groupBy("movie").avg("rating").show()
  • 谢谢猪,这解决了它,但我需要使用 RDD 的 :/...

标签: pyspark average rdd calculation


【解决方案1】:

您可以使用以下内容将您的列表转换为 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|
#+----------------+-----------+

【讨论】:

  • 感谢 Pissal 的回答,这确实使用数据框解决了它。但是我是否使用 RDD 来做到这一点?这就是我正在从事的项目的目的:/(我知道 RDD 相对于 DataFrames 和 Datasets 已经过时了,但我不得不使用 RDD 来做到这一点:/。
  • 请参阅此答案以了解为什么 Dataframe 比 RDD 更好。 stackoverflow.com/questions/58367567/…
  • SHORT :一般来说,由于内置查询优化,建议尽可能使用 DataFrame。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多