spark实现WordCount(多种实现方式)

第一种方式:

文件内容:
在这里插入图片描述

object WordCount {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")

    /// 创建Spark上下文对象
    val sc = new SparkContext(conf)

    // 读取文件种的数据
    val textRDD: RDD[String] = sc.textFile("in")

    // 扁平化, 按照" "来切割
    val wordRDD: RDD[String] = textRDD.flatMap {
      case x => {
        x.split(" ")
      }
    }

    // 转换结构
    val mapRDD: RDD[(String, Int)] = wordRDD.map {
      case x => {
        (x, 1)
      }
    }

    val rdRDD: RDD[(String, Int)] = mapRDD.reduceByKey {
      case (x, y) => {
        x + y
      }
    }

    //收集遍历
    rdRDD.collect().foreach(println)
  }
}

输出:
(scala,4)
(spark,3)
(hadoop,1)
(python,1)
(hello,14)
(java,3)
(world,2)


第二种方式:

object WordCount {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")

    /// 创建Spark上下文对象
    val sc = new SparkContext(conf)

    // 读取文件种的数据
    val textRDD: RDD[String] = sc.textFile("in")

    // 扁平化, 按照" "来切割
    val wordRDD: RDD[String] = textRDD.flatMap {
      case x => {
        x.split(" ")
      }
    }
    // 转换结构
    val mapRDD: RDD[(String, Int)] = wordRDD.map {
      case x => {
        (x, 1)
      }
    }
    // 使用groupByKey方法
    val gBKRDD: RDD[(String, Iterable[Int])] = mapRDD.groupByKey()
    val mVRDD: RDD[(String, Int)] = gBKRDD.mapValues {
      case x => {
        x.sum
      }
    }
    mVRDD.collect().foreach(println)
  }
}

输出为:
(scala,4)
(spark,3)
(hadoop,1)
(python,1)
(hello,14)
(java,3)
(world,2)


第三种方式:

object WordCount {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")

    /// 创建Spark上下文对象
    val sc = new SparkContext(conf)

    // 读取文件种的数据
    val textRDD: RDD[String] = sc.textFile("in",2)

    // 扁平化, 按照" "来切割
    val wordRDD: RDD[String] = textRDD.flatMap {
      case x => {
        x.split(" ")
      }
    }

    // 转换结构
    val mapRDD: RDD[(String, Int)] = wordRDD.map {
      case x => {
        (x, 1)
      }
    }
    
    // 使用aggregateByKey方法
    val aggRDD: RDD[(String, Int)] = mapRDD.aggregateByKey(0)((x,y) => x+y, (x,y)=> x+y)
    aggRDD.collect().foreach(println)
     
  }
}

输出为:
(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(spark,3)
(hadoop,1)


第四种方式:

object WordCount {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")

    /// 创建Spark上下文对象
    val sc = new SparkContext(conf)

    // 读取文件种的数据
    val textRDD: RDD[String] = sc.textFile("in",2)

    // 扁平化, 按照" "来切割
    val wordRDD: RDD[String] = textRDD.flatMap {
      case x => {
        x.split(" ")
      }
    }

    // 转换结构
    val mapRDD: RDD[(String, Int)] = wordRDD.map {
      case x => {
        (x, 1)
      }
    }
    // 使用foldByKey方法 
    val foldRDD: RDD[(String, Int)] = mapRDD.foldByKey(0)((x,y) => x+y)
    // 收集遍历
    foldRDD.collect().foreach(println)
 }
}

输出为:
(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(spark,3)
(hadoop,1)


第五种方式:
第五种比较复杂, 我是因为练习combineByKey方法,才写了这个WordCount。其实可以不用combineByKey方法来写WordCount. 用上面四种方式就可以.

object WordCount {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")

    /// 创建Spark上下文对象
    val sc = new SparkContext(conf)

    // 读取文件种的数据
    val textRDD: RDD[String] = sc.textFile("in",2)

    // 扁平化, 按照" "来切割
    val wordRDD: RDD[String] = textRDD.flatMap {
      case x => {
        x.split(" ")
      }
    }

    // 转换结构
    val mapRDD: RDD[(String, Int)] = wordRDD.map {
      case x => {
        (x, 1)
      }
    }
    
    // 使用combinByKey方法
    val combinRDD: RDD[(String, (Int, Int))] = mapRDD.combineByKey((_, 1), (acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1), (acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2))

    // 使用mapValues方法
    val mvRDD: RDD[(String, Int)] = combinRDD.mapValues {
      case x => {
        x._1
      }
    }
    // 收集遍历
    combinRDD.collect().foreach(println)
    mvRDD.collect().foreach(println)
  }
}

输出为:

// (scala, (4,4))中的(4,4), 第一个4是表示所有的v值相加, 第二个4表示v值出现的次数
(scala,(4,4))
(python,(1,1))
(hello,(14,14))
(java,(3,3))
(world,(2,2))
(hadoop,(1,1))
(c,(3,3))

(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(hadoop,1)
(c,3)
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值