[Apache Spark API][GroupByKey Vs ReduceByKey]

http://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions 

val words = Array("one", "two", "two", "three", "three", "three")  
  
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))  
  
val wordCountsWithReduce = wordPairsRDD.reduceByKey(_ + _)  
  
val wordCountsWithGroup = wordPairsRDD.groupByKey().map(t => (t._1, t._2.sum))  

reduceByKey(func: (V,V) => V, numPartitions: Int): RDD[(K,V)]

reduceByKey用于对每个key对应的多个value进行本地先merge操作,并且merge操作可以通过函数自定义

groupByKey(numPartitions: Int): RDD[(K,Iterable[V])]

groupByKey也是对每个key进行操作,但是只生成一个sequence。如果需要对sequence进行aggregation操作时,groupByKey本身是不能自定义操作函数的。

(1) 采用reduceByKey时,spark可以在每个分区shuffle之前,将待输出的数据与一个共用的key结合。即在shuffle之前调用lamdba函数,先计算一遍。等shuffle候,再执行lamdba函数。减少了shuffle过程的数据量。

(2)groupByKey 不接受lamdba函数,spark只能shuffle所有的k-v pair.之后再调用lamdba函数计算。造成了集群节点之间的开销很大。

注意:

(1)在对大数据进行复杂计算时,reduceByKey优于groupByKey

(2)如果仅仅是group处理,那么以下函数应该优先于 groupByKey

        (1)、combineByKey 组合数据,但是组合之后的数据类型与输入时值的类型不一样。

        (2)、foldByKey合并每一个 key 的所有值,在级联函数和“零值”中使用。

猜你喜欢

转载自my.oschina.net/u/204498/blog/838474
今日推荐