combinebykey和aggregatebykey之间的区别

时间:2017-04-19 07:44:28

标签: java apache-spark

我对Apache spark很新,所以这个问题可能不太好问,但我没有区分combinebykeyaggregatebykey以及何时使用哪个操作。

2 个答案:

答案 0 :(得分:3)

aggregateByKey接受一个初始累加器,第一个lambda函数将值合并到累加器,第二个lambda函数合并两个累加器。

combineByKey更通用,并添加一个初始lambda函数来创建初始累加器

这是一个例子:

val pairs = sc.parallelize(List(("prova", 1), ("ciao", 2),
                                ("prova", 2), ("ciao", 4),
                                ("prova", 3), ("ciao", 6)))

pairs.aggregateByKey(List[Any]())(
  (aggr, value) => aggr ::: (value :: Nil),
  (aggr1, aggr2) => aggr1 ::: aggr2
).collect().toMap

pairs.combineByKey(
  (value) => List(value),
  (aggr: List[Any], value) => aggr ::: (value :: Nil),
  (aggr1: List[Any], aggr2: List[Any]) => aggr1 ::: aggr2
).collect().toMap

答案 1 :(得分:2)

combineByKeyaggregateByKey更通用。实际上,aggregateByKeyreduceByKeygroupByKey的实施是由combineByKey实现的。 aggregateByKeyreduceByKey类似,但您可以在执行聚合时提供初始值。

顾名思义,aggregateByKey适用于密钥的计算聚合,例如sum,avg等示例聚合。这里的规则是地图侧合并花费的额外计算可以减少发送的大小到其他节点和驱动程序。如果您的func符合此规则,则可能应使用aggregateByKey

combineByKey更为通用,您可以灵活地指定是否要执行地图侧合并。但是,使用起来更复杂。至少,您需要实现三个功能:createCombinermergeValuemergeCombiners