我是很新的Apache的火花所以这个问题可能不是很好问,但我没有得到之间的区别combinebykey,并aggregatebykey和时所使用的操作.
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
Run Code Online (Sandbox Code Playgroud)
combineByKey那么就比较笼统了aggregateByKey。aggregateByKey实际上,和reduceByKey的实现groupByKey是通过 实现的combineByKey。aggregateByKey类似于,reduceByKey但您可以在执行聚合时提供初始值。
顾名思义,aggregateByKey适用于键的计算聚合,例如 sum、avg 等聚合。这里的规则是,用于映射端组合的额外计算可以减少发送到其他节点和驱动程序的大小。如果您func满足此规则,您可能应该使用aggregateByKey.
combineByKey更通用,您可以灵活地指定是否要执行地图侧组合。但使用起来比较复杂。至少,您需要实现三个功能:createCombiner、mergeValue、mergeCombiners。
| 归档时间: |
|
| 查看次数: |
3507 次 |
| 最近记录: |