map reduce 问题,计算值

map reduce problem, computation at values

我是 map reduce 范例的新手,正在尝试为以下问题找到更好的解决方案。

我有以下一组行 - 包含 google play store app reviews ,列是 AppName,Category,Type,rating,示例行可以是 [Zomato,Food,Free,4.2],[ Swiggy,Food,Paid,3.2] 等等 问题,找出每个类别的平均付费和免费评级之间的比率? 我如何使用 map reduce paradigm / spark

来解决这个问题

是否像在地图端发出键和复合值作为 (Food, (Free,4.2)), (Food,(Paid,3.2)) 然后用列表(值)在reduce端进行平均计算?有没有更好的办法?

在 spark 中,这将非常简单。 map reduce 逻辑将对您完全隐藏。

// let's define some data
val df = Seq((0, "cat_a", "free", 2.5), (1, "cat_a", "free", 3.5), (2, "cat_a", "paid", 4.1),
             (3, "cat_a", "paid", 4.5), (4, "cat_b", "free", 2.5), (5, "cat_b", "paid", 4.8))
    .toDF("app", "cat", "type", "rating")

df.show
+---+-----+----+------+
|app|  cat|type|rating|
+---+-----+----+------+
|  0|cat_a|free|   2.5|
|  1|cat_a|free|   3.5|
|  2|cat_a|paid|   4.1|
|  3|cat_a|paid|   4.5|
|  4|cat_b|free|   2.5|
|  5|cat_b|paid|   4.8|
+---+-----+----+------+

那么就这么简单:

val result = df.groupBy("cat").pivot("type")
    .agg(avg('rating))
    .withColumn("ratio", 'free / 'paid)

result.show
+-----+----+----+------------------+
|  cat|free|paid|             ratio|
+-----+----+----+------------------+
|cat_b| 2.5| 4.8|0.5208333333333334|
|cat_a| 3.0| 4.3|0.6976744186046512|
+-----+----+----+------------------+

注意:如果你知道类型只能付费或免费,你可以使用.pivot("type", Seq("paid", "free")这样会更有效。