RDD wordCount 算子(总结)

RDD wordCount 算子(总结)

之前我们学了很多的算子,好像都能用来做wordcount,所以我们来总结一下吧,哪些算子可以做wordcount。
总结了一下,之前学了的方法大概可以用十种方法来做WordCount。
例如:groupBy,groupByKey,reduceByKey,aggregateByKey,foldByKey,combineByKey,countByKey,countByValue 由于,reduce和fold太复杂了,那两个方法就先不用了。
这八个方法里面强烈推荐使用 reduceByKeycountByKeycountByValue 这三个算子,reduceByKey 算子性能非常高,countByKey,这个算子本身就是wordcount,非常的快捷,类型需要键值对。countByValue 这个算子最最快捷,直接这个方法就出来了。
注意:无论用哪个算子进行wordcount,都要先用flatMap(_.split(" "))算子进行扁平映射处理。

package com.atguigu.bigdata.spark.core.wc.action

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

import scala.collection.mutable

//让我们总结一下,哪些算子可以做WordCount
class Spark05_wordcount {

}
object Spark05_wordcount{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)
    wordCount1(context) //这里是调用方法
    println("===========")
    wordCount2(context)
    println("===========")
    wordCount3(context)
    println("===========")
    wordCount4(context)
    println("===========")
    wordCount5(context)
    println("===========")
    wordCount6(context)
    println("===========")
    wordCount7(context)
    println("===========")
    wordCount8(context)
    

    //groupBy 是wordcount的核心算子,通过groupBy方法相同的单词都分到一个组,只需要获取这个组的长度就行了
    def wordCount1(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val group: RDD[(String, Iterable[String])] = mapRDD.groupBy(word => word) //相同的单词分到一个组里面
      val result: RDD[(String, Int)] = group.mapValues(iter => iter.size) //因为是一个迭代器,获取size
      result.collect().foreach(println)
    }

    //groupByKey: 需要key-value类型,自动根据key进行分组
    def wordCount2(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val groupRDD: RDD[(String, Iterable[Int])] = mapRDD2.groupByKey()
      val result = groupRDD.mapValues(iter => iter.size)
      result.collect().foreach(println)
    }

    //reduceByKey: 需要key-value类型,直接根据key两两相加 效率很高
    def wordCount3(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val reduceRDD: RDD[(String, Int)] = mapRDD2.reduceByKey(_ + _)//直接根据key两两相加
      reduceRDD.collect().foreach(println)
    }

    //aggregateByKey: 需要key-value类型,有个初始值,然后直接进行分区内计算,和分区间计算
    def wordCount4(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val result = mapRDD2.aggregateByKey(0)(_ + _, _ + _)
      result.collect().foreach(println)
    }

    //foldByKey: 需要key-value类型,当分区规则相同时,可以简化为foldByKey
    def wordCount5(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val result: RDD[(String, Int)] = mapRDD2.foldByKey(0)(_ + _)
      result.collect().foreach(println)
    }

    //combineByKey: 需要key-value类型,有三个参数,第一个参数是将第一个数据进行转换,作为第一个数据
    //然后第二个参数是分区内计算,第三个参数是分区间计算
    def wordCount6(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val result: RDD[(String, Int)] = mapRDD2.combineByKey(
        v => v,
        (x: Int, y) => x + y, //分区内计算
        (x: Int, y: Int) => x + y //分区间计算
      )
      result.collect().foreach(println)
    }

    //countByKey: 需要key-value类型,直接这个方法就出来了,非常推荐使用这个方法
    def wordCount7(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val mapRDD2 = mapRDD.map((_, 1))
      val result: collection.Map[String, Long] = mapRDD2.countByKey()
      println(result)
    }

    //countByValue: 不需要key-value类型,单值类型就行了,有单词直接就统计了
    def wordCount8(context:SparkContext):Unit={ //参数是配置文件,SparkContext、类型的
      val rdd = context.makeRDD(List("Hello Scala","Hello Spark"))
      val mapRDD = rdd.flatMap(_.split(" "))
      val result: collection.Map[String, Long] = mapRDD.countByValue()
      println(result)
    }
    
    context.stop()
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值