sparkRDD操作之ReduceByKey和GroupByKey比较

本文通过代码示例详细讲解了Spark中ReduceByKey和GroupByKey的区别。在WordCount应用中,ReduceByKey直接对键值对进行聚合,而GroupByKey则先将相同键的数据分组后再进行聚合。这两种操作在性能和使用场景上有不同侧重,ReduceByKey通常更高效。
摘要由CSDN通过智能技术生成

sparkRDD操作之ReduceByKey和GroupByKey比较

直接看代码

package cn.sparkdemo.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object TestRDDFuctions {
  def main(args: Array[String]): Unit = {
    //1、创建上下文对象
    val sparkConf: SparkConf = new SparkConf()
    .setAppName(this.getClass.getSimpleName.stripSuffix("$"))
    .setMaster("local[*]")
    val sc = new SparkContext(sparkConf)
    //2、加载数据形成RDD
    val inputRDD: RDD[String] = sc.parallelize(Array(
      "hello me you her",
      "hello you her",
      "hello her",
      "hello"
    ))
    //3、将RDD的长文本拆分成单词
    val wordRDD: RDD[String] = inputRDD.flatMap(_.split("\\s+"))
    //4、继续为每个单词标记为1
    //tupleRDD :[(hello,1),(hello,1),(hello,1),(hello,1),(me,1),(you,1)..........]
    val tupleRDD: RDD[(String, Int)] = wordRDD.map((_, 1))

    //5、用groupByKey来做wordcount
    //groupedRDD:[(hello,[1,1,1,1]),(me,[1]),(you,[1,1]),.......]
    val groupedRDD: RDD[(String, Iterable[Int])] = tupleRDD.groupByKey()
    //(x -> y) 即元组(x,y)
    //wordcountRDD1:[(hello,4),(me,1),(you,2).......]
    val wordcountRDD1: RDD[(String, Int)] = groupedRDD.map(x => x._1 -> x._2.sum)
    //用另一个写法
    val wordcountRDD2: RDD[(String, Int)] = groupedRDD.mapValues(x => x.sum)
    //6、打印结果
    println("groupByKey:")
    wordcountRDD1.foreach(println(_))
    //groupedRDD.foreach(println(_))
    //7、用reduceByKey和foldByKey来做wordcount
    //tupleRDD 以hello为例, 有(hello,1) (hello,1) (hello,1) (hello,1)
    //reduceBYKey , 其实是先groupByKey再reduce
    //先ByKey,变成了 hello -> [1,1,1,1]
    //再reduce,对[1,1,1,1]进行聚合比如 _+_ , 变成了4
    //最后总体变成了hello -> 4
    //上面2步合为一步就是reduceByKey
    val wordcountRDD3: RDD[(String, Int)] = tupleRDD.reduceByKey(_ + _)
    val wordcountRDD4: RDD[(String, Int)] = tupleRDD.foldByKey(0)(_ + _)
    //8、打印结果
    println("reduceByKey:")
    wordcountRDD3.foreach(println(_))
    println("foldByKey:")
    wordcountRDD4.foreach(println(_))
    //9、用aggregateByKey来做wordcount
    val wordcountRDD5: RDD[(String, Int)] = tupleRDD.aggregateByKey(0)(_ + _, _ + _)
    //10、打印结果
    println("aggregateByKey:")
    wordcountRDD5.foreach(println(_))

    //11、关闭上下文
    sc.stop()
  }
}
  • reduceBYKey , 其实是先groupByKey再reduce,如上例wordRDD.map((_, 1))之后有有(hello,1) (hello,1) (hello,1) (hello,1),先GroupByKey,变成了 hello -> [1,1,1,1],再reduce,对[1,1,1,1]进行聚合比如 + , 变成了4
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值