【问题标题】:Difference between combinebykey and aggregatebykeycombinebykey 和 aggregatebykey 的区别
【发布时间】:2017-04-19 18:44:00
【问题描述】:

我对 Apache spark 很陌生,所以这个问题可能不好问,但我不明白 combinebykeyaggregatebykey 之间的区别以及何时使用哪个操作。

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

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

      顾名思义,aggregateByKey 适用于键的计算聚合,例如 sum、avg 等聚合。这里的规则是 map 端组合花费的额外计算可以减少发送给其他的大小节点和驱动程序。如果您的func 满足此规则,您可能应该使用aggregateByKey

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

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多