我对Apache spark很新,所以这个问题可能不太好问,但我没有区分combinebykey
和aggregatebykey
以及何时使用哪个操作。
答案 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)
combineByKey
比aggregateByKey
更通用。实际上,aggregateByKey
,reduceByKey
和groupByKey
的实施是由combineByKey
实现的。 aggregateByKey
与reduceByKey
类似,但您可以在执行聚合时提供初始值。
顾名思义,aggregateByKey
适用于密钥的计算聚合,例如sum,avg等示例聚合。这里的规则是地图侧合并花费的额外计算可以减少发送的大小到其他节点和驱动程序。如果您的func
符合此规则,则可能应使用aggregateByKey
。
combineByKey
更为通用,您可以灵活地指定是否要执行地图侧合并。但是,使用起来更复杂。至少,您需要实现三个功能:createCombiner
,mergeValue
,mergeCombiners
。