【发布时间】:2015-07-08 19:00:08
【问题描述】:
我有一个包含 (stockName, stockValue) 元组的 RDD。许多股票是重复的并且具有不同的价值。
例如("ARM", 200.6)("GOOG", 4000.4)("ARM", 3998.23)("ARM", 4002.45)等
这个想法是收集所有类似的股票并计算它们的平均值。
在下面的代码中,map 将每只股票转换为(key, (total, 1))
例如("ARM", (200.6, 1))
reduceByKey 聚合所有同名股票,并独立汇总它们的值和计数。使计算每只股票的平均值变得容易(代码未显示)。
val partial = stocks.map{ case(stock: String, value: Double) => (stock, (value, 1)) }
.reduceByKey( (x, y) => (x._1 + y._1, x._2 + y._2) )
在map 中我已经能够使用模式匹配来清楚地表达转换。我希望能够对传递给reduceByKey 的函数参数做同样的事情,以使其更具可读性。
到目前为止,我无法改进 (x, y) => (x._1 + y._1, x._2 + y._2)。
有什么建议吗?
【问题讨论】:
-
stocks.groupBy(_._1).mapValues(_.foldLeft((0.0, 0))((total, next) => (total._1 + next._2, total._2 + 1))) // Map(ARM -> (8201.279999999999,3), GOOG -> (4000.4,1))
标签: scala apache-spark