【发布时间】:2017-04-19 18:44:00
【问题描述】:
我对 Apache spark 很陌生,所以这个问题可能不好问,但我不明白 combinebykey 和 aggregatebykey 之间的区别以及何时使用哪个操作。
【问题讨论】:
标签: java apache-spark
我对 Apache spark 很陌生,所以这个问题可能不好问,但我不明白 combinebykey 和 aggregatebykey 之间的区别以及何时使用哪个操作。
【问题讨论】:
标签: java apache-spark
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
【讨论】:
combineByKey 比 aggregateByKey 更通用。其实aggregateByKey、reduceByKey和groupByKey的实现是由combineByKey实现的。 aggregateByKey 与 reduceByKey 类似,但您可以在执行聚合时提供初始值。
顾名思义,aggregateByKey 适用于键的计算聚合,例如 sum、avg 等聚合。这里的规则是 map 端组合花费的额外计算可以减少发送给其他的大小节点和驱动程序。如果您的func 满足此规则,您可能应该使用aggregateByKey。
combineByKey 更通用,您可以灵活地指定是否要执行地图侧合并。但是,使用起来比较复杂。至少需要实现三个函数:createCombiner、mergeValue、mergeCombiners。
【讨论】: