官网介绍
- reduceByKey(func, [numPartitions])当在 (K, V) 对的数据集上调用时,返回 (K, V) 对的数据集,其中每个键的值使用给定的 reduce 函数func聚合,该函数必须是 (V,V) => V. 与 中一样groupByKey,reduce 任务的数量可通过可选的第二个参数进行配置。
- groupByKey ([ numPartitions ])
当在 (K, V) 对的数据集上调用时,返回 (K, Iterable) 对的数据集。
注意:如果您分组是为了对每个键执行聚合(例如求和或平均值),使用reduceByKey或aggregateByKey将产生更好的性能。
注意:默认情况下,输出中的并行级别取决于父 RDD 的分区数。您可以传递一个可选numPartitions参数来设置不同数量的任务。 - aggregateByKey ( zeroValue )( seqOp ,combOp , [ numPartitions ])
当在 (K, V) 对的数据集上调用时,返回 (K, U) 对的数据集,其中每个键的值使用给定的组合函数和中性“零”值聚合。允许与输入值类型不同的聚合值类型,同时避免不必要的分配。与 in 一样groupByKey,reduce 任务的数量可通过可选的第二个参数进行配置。
用法
- reduceByKey
1//1.创建一个RDD
val rdd1: RDD[String] = sc.makeRDD(List("one", "two", "two", "three", "three", "three"))
//2.相同key对应值的相加结果
val rdd2: RDD[(String, Int)] = rdd1.map((_,1)).groupByKey().map(v=>(v._1,v._2.size))
//3.打印
rdd2.collect().foreach(println)
//结果(three,3) (two,2) (one,1)
- groupByKey
groupByKey 必须能够保存任何键在内存中。 如果一个键有太多的值,它可能会导致OutOfMemoryError
。这里我们如果使用groupByKey 处理大量数据的话需放置出现内存OOM
//1.创建一个RDD
val rdd1: RDD[String] = sc.makeRDD(List("one", "two", "two", "three", "three", "three"))
//2.相同key对应值的相加结果
val rdd2: RDD[(String, Int)] = rdd1.map((_,1)).groupByKey().map(v=>(v._1,v._2.size))
//3.打印
rdd2.collect().foreach(println)
//结果(three,3) (two,2) (one,1)
- aggregateByKey
//1.创建一个RDD
val rdd1: RDD[(String,Int)] = sc.makeRDD(List(("a",3),("a",2),("c",4),("b",3),("c",6),("c",8)),2)
//2.取出每个分区相同key对应值的最大值
val rdd2: RDD[(String, Int)] = rdd1.aggregateByKey(0)((v1,v2)=> if(v1 > v2) v1 else v2 ,_+_)
//3.打印
rdd2.collect().foreach(println)
//结果:(b,3) (a,3) (c,12)