我有一个包含(stockName, stockValue)
元组的RDD。许多股票都是重复的,并且具有不同的价值。
e.g。 ("ARM", 200.6)
("GOOG", 4000.4)
("ARM", 3998.23)
("ARM", 4002.45)
等。
我们的想法是收集所有类似股票并计算其平均值。
在下面的代码中,map
会将每个股票转换为(key, (total, 1))
e.g。 ("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)
。
有什么建议吗?
答案 0 :(得分:1)
您可以嵌套模式以将(x, y)
解构为((x1, x2), (y1, y2))
val partial = stocks.map {
case (stock, value) => stock -> (value, 1)
}.reduceByKey {
case ((value1, count1), (value2, count2)) => (value1 + value2, count1 + count2)
}