reduceByKey(_ ++ _)的含义是什么?

6

最近我遇到了一个场景,需要以键值对的形式存储数据,并使用函数reduceByKey(_ ++ _)。这更像是一种简写语法。我不理解它的实际含义。

例如:reduceBykey(_ + _)表示reduceByKey((a,b)=>(a+b))

那么reduceByKey(_ ++ _)的含义是什么?

使用reduceByKey(_ ++ _),我可以从数据中创建键值对。

val y = sc.textFile("file:///root/My_Spark_learning/reduced.txt")

y.map(value=>value.split(","))
  .map(value=>(value(0),value(1),value(2)))
  .collect
  .foreach(println)

(1,2,3)
(1,3,4)
(4,5,6)
(7,8,9)

y.map(value=>value.split(","))
  .map(value=>(value(0),Seq(value(1),value(2))))
  .reduceByKey(_ ++ _)
  .collect
  .foreach(println)

(1,List(2, 3, 3, 4))
(4,List(5, 6))
(7,List(8, 9))
2个回答

8

reduceByKey(_ ++ _) 的意思是 reduceByKey((a,b) => a ++ b)

++ 是定义在 List 上的一个方法,用于将另一个列表连接到该列表后面。

因此,在样本数据中,针对键 1,a 将是 List(2,3)b 将是 List(3,4),因此将 List(2,3)List(3,4) 进行连接(List(2,3) ++ List(3,4))将得到 List(2,3,3,4)


感谢您的解释。 - Rohan Nayak

1

reduceByKey(_ ++ _) 相当于 reduceByKey((x,y)=> x ++ y)

reduceByKey 接受两个参数,应用一个函数并返回结果。

一开始它创建了一个集合,++ 只是将集合相加,组合两个集合的元素。

对于每个键,它会在列表中继续添加。 在您的案例中,当键为 1 时,x 将为 List(2,3),y 将为 List (3,4),而 ++ 将这两个列表加起来得到 List(2,3,3,4)

如果您有另一个值如 (1,4,5),则此时 x 将为List(4,5),y 应该是 List (2,3,3,4),结果将是 List(2,3,3,4,4,5)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接