模式匹配Apache Spark的reduceByKey()中的Scala(key,Tuple2)值

时间:2015-07-07 22:31:59

标签: scala apache-spark

我有一个包含(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)

有什么建议吗?

1 个答案:

答案 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)
}