Scala单词统计WordCount一般的和二元组拆分

文章展示了如何使用Scala进行单词统计,包括对字符串列表的拆分、扁平化、分组和计数操作,模拟Hadoop的MapReduce过程。同时,对比了两种不同的处理二元组形式的单词统计方法,强调学习编程需要耐心和理解。
摘要由CSDN通过智能技术生成

scala单词统计的过程,有Hadoop基础的同学应该能更好的理解,类似于mapreduce的过程。

复杂的(k,v)类型的List,流程,先拆分在统计或者先将相同的k统计组成一个新的二元组,再拆分。

先上一个简单的:

object Test17_CommonWordCount {
  def main(args: Array[String]): Unit = {
    val stringList: List[String] = List("hello scala", "hello redmi", "beautiful girl", "it is java", "learn spark")

    /*//拆分单词,按空格拆分
    val splitList: List[Array[String]] = stringList.map(_.split(" "))
    //flatten,扁平化,将嵌套结构打散
    val flatten: List[String] = splitList.flatten
    println(flatten)*/

    // 拆分单词简写,组成单词表
    val wordList = stringList.flatMap(_.split(" "))
    println(wordList)

    //以单词分组
    val stringToList: Map[String, List[String]] = wordList.groupBy(_ + "") //这里分组key是word,value也是word,_出错,和groupBy(_.2)不同

    //获取每组的长度,即每个单词的个数
    val countMap: Map[String, Int] = stringToList.map(kv => (kv._1, kv._2.length))

    //map转为List,sortWith做一个简单排序,按数量降序排列
    val list: List[(String, Int)] = countMap.toList.sortWith(_._2 > _._2)
    println(list)
  }
}

 对于最后的输出结果做一个取前三的操作,在最后加一个 .take(3) 的操作即可

//将map转换为list,取前三
    val list: List[(String, Int)] = countMap.toList.sortWith(_._2 > _._2).take(3)   //转为list,在对其排序输出
    println(list)

 接着上一个复杂的,二元组形式的单词统计

object Test18_ComplexWordCount {
  def main(args: Array[String]): Unit = {
    val tupleList: List[(String, Int)] = List(
      ("hello scala", 1),
      ("hello redmi", 2),
      ("beautiful girl", 2),
      ("it is java", 1),
      ("learn spark", 2),
      ("hello spark from spark", 2))

    //----------------方法一:转为普通的形式
    //拆分单词
    val stringList: List[String] = tupleList.map(
      kv => (kv._1 + " ") * kv._2
    )

    println(stringList)

    val wordList: List[(String, Int)] = stringList
      .flatMap(_.split(" ")) //空格分词
      //      .groupBy(word => word)
      .groupBy(_ + "") //按照单词分组
      .map(kv => (kv._1, kv._2.size)) // 统计个数
      .toList
      .sortBy(_._2)(Ordering[Int].reverse) //相比于sortWith节省资源
    //      .sortWith(_._2 > _._2)
    println(wordList)
    println("======================================")


    //--------------------方法二:基于预统计的结果进行转换
    //将字符串打散,并结合对应的个数组合成新的二元组
    val preCountList: List[(String, Int)] = tupleList.flatMap(
      tuple => {
        val value: Array[String] = tuple._1.split(" ")
        println("value: " + value.mkString)
        value.map(word => (word, tuple._2)).reverse
      }
    )
    println("preCountList: " + preCountList)
    //对二元组按照单词进行分组
    val preCountMap: Map[String, List[(String, Int)]] = preCountList.groupBy(tuple => tuple._1)
    println(preCountMap)

    val countMap: Map[String, Int] = preCountMap.mapValues(
      newTupleList => newTupleList.map(_._2).sum
    )

    println(countMap)

    val countList: List[(String, Int)] = countMap.toList.sortBy(_._2)(Ordering[Int].reverse)
    println(countList)
  }
}

各位,学海无涯,着急不来,慢慢体会吧。

ps:有人问我Scala是跟谁学的,我是跟着尚硅谷学的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值