• Scala编程实战 —— 一文学会编码大数据基础案例wordcount


    ??♂??♂ 写在前面

    ?? 个人主页:csdn春和
    ?? 推荐专栏:更多专栏尽在主页!
    JavaWeb专栏(从入门到实战超详细!!!)
    SSM专栏 (更新中…)
    ?? 本期文章:Scala编程实战 —— 一文学会编码大数据基础案例wordcount
    如果对您有帮助还请三连支持,定会一 一回访!???♂


    ??本文目录


    Scala开发实战练习

    1、Word count案例实战

    1.1、word count 过程分析

    在这里插入图片描述

    1.2、代码实现过程

    // TODO 1、读取文件 获取原始数据
    
    // TODO 2、扁平化 将原始数据拆分为一个个单词
    
    // TODO 3、对单词进行分组操作
    
    // TODO 4、对分组后的数据进行数量的统计
    
    // TODO 5、将统计结果打印
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.3、编码实现

    object Scala_Collection04_WordCount {
      def main(args: Array[String]): Unit = {
        // TODO word count案例
    
        // TODO 1、读取文件 获取原始数据
        val source: BufferedSource = Source.fromFile("data/word.txt")
        val array: Array[String] = source.getLines().toArray // 将每一行的数据 放到一个数组中
        source.close()
    
        // TODO 2、扁平化 将原始数据拆分为一个个单词
        val flatMap = array.flatMap(line => line.split(" "))
    
        // TODO 3、对单词进行分组操作
        val wordGroup: Map[String, Array[String]] = flatMap.groupBy(word => word)
    
        // TODO 4、对分组后的数据进行数量的统计
        // 如果数据在转换的时候无需对key进行操作,只针对value进行处理,可以使用mapValues方法
        val wordCount: Map[String, Int] = wordGroup.mapValues(v => v.size)
    
        // TODO 5、将统计结果打印
        println(wordCount)
    
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    如果非要使用map进行映射则可以这样写

    // 使用map
    val count = wordGroup.map(
      t => {
        val k = t._1
        val v = t._2
        (k, v.size)
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    写法二:

    object Scala_Collection04_WordCount2 {
      def main(args: Array[String]): Unit = {
        // TODO word count案例
        val list = List(
          "hello scala scala", "hello spark"
        )
    
        val flatMap: Seq[String] = list.flatMap(_.split(" "))
        val group: Map[String, Seq[String]] = flatMap.groupBy(word => word)
        val count = group.map(t => (t._1, t._2.size))
        println(count)
    
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.4、wordcount进阶

    假如给的数据不是那样的呢?

     val list = List(
          ("hello scala scala",4), ("hello spark",2)
        )
    
    • 1
    • 2
    • 3

    需求还是统计wordcount

    这样我们需要将数据格式转换为我们所需要的

    方法一:

    将数据变为 “hello spark hello spark” 多了一步数据结构转变的操作

    在这里插入图片描述

    编码:

    // TODO word count案例
    val list = List(
      ("hello scala scala",4), ("hello spark",2)
    )
    
    // 数据结构变化  ("hello spark",2) -> "hello spark hello spark"
    
    // TODO 1、转换数据结构
    val map: Seq[String] = list.map(
      t => {
        val line = t._1
        val count = t._2
        (line + " ") * count
      }
    )
    
    // TODO 2、扁平化映射
    val flatMap: Seq[String] = map.flatMap(_.split(" "))
    
    // TODO 3、分组
    val groupMap: Map[String, Seq[String]] = flatMap.groupBy(word => word)
    
    // TODO 4、聚合 wordcount
    val wordcount = groupMap.map(
      kv => {
        (kv._1, kv._2.size)
      }
    )
    
    println(wordcount)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    方法二:

    将数据转换为 (hello,4)(scala,4)这样的数据格式

    编码实现:

    def main(args: Array[String]): Unit = {
      // TODO word count案例
      val list = List(
        ("hello scala scala",4), ("hello spark",2)
      )
    
      // 将数据转变 (hello,4) (scala,4)
    
      // TODO 1、转换数据结构
      val map = list.flatMap(
        t => {
          val line = t._1
          val count = t._2
          val words = line.split(" ")
          words.map(
            word => (word, count)
          )
        }
      )
    
      // TODO 2、分组 
      val group: Map[String, List[(String, Int)]] = map.groupBy(_._1)
    
      
      // TODO 3、聚合
      val wordcount: Map[String, Int] = group.mapValues(
        list => {
          list.map(_._2).sum  
        }
      )
      println(wordcount)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2、需求实战

    2.1、需求分析

    需求:统计不同省份的商品点击排行

    分析:不同省份为key 商品点击排行为value

    在这里插入图片描述

    2.2、编码实现

    package com.zhou.scala.chapter6
    
    /**
     * @author 
     * @create 2022-05-14 16:39
     */
    object Scala_Collection12_Exercise {
      def main(args: Array[String]): Unit = {
    
        val list = List(
          ("zhangsan", "河北", "鞋"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "鞋"),
          ("zhangsan", "河南", "鞋"),
          ("lisi", "河南", "衣服"),
          ("wangwu", "河南", "鞋"),
          ("zhangsan", "河南", "鞋"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "鞋"),
          ("zhangsan", "河北", "鞋"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "帽子"),
          ("zhangsan", "河南", "鞋"),
          ("lisi", "河南", "衣服"),
          ("wangwu", "河南", "帽子"),
          ("zhangsan", "河南", "鞋"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "帽子"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "电脑"),
          ("zhangsan", "河南", "鞋"),
          ("lisi", "河南", "衣服"),
          ("wangwu", "河南", "电脑"),
          ("zhangsan", "河南", "电脑"),
          ("lisi", "河北", "衣服"),
          ("wangwu", "河北", "帽子")
        )
    
        // TODO 1、数据结构转变 (人,省份,商品) --> (省份 商品,1)
        val mapData = list.map(
          t => {
            ((t._2 + " " + t._3), 1)
          }
        )
    
        // TODO 2、分组 相同名字 相同省份的一组
        val groupData = mapData.groupBy(_._1)
    
        println(groupData)
    
        // TODO 3、聚合  Map (河南 衣服 -> 3, 河南 鞋 -> 6
        val countData = groupData.mapValues(
          list => list.size
        )
    
        println(countData)
    
        // TODO 4、将聚合结果进行数据结构转换
        val mapData1 = countData.toList.map(  // 注意这里需要将counData转为List 不然是map map的话会覆盖相同的key 造成数据统计不对
          kv => {
            val keys = kv._1.split(" ")
            (keys(0), (keys(1), kv._2))
          }
        )
    
        // TODO 5、分组
        val groupData1 = mapData1.groupBy(_._1)
          // TODO 6、处理value 只保留商品 点击次数
          .mapValues(
            list => {
              list.map(_._2)
                // TODO 7、进行排序 降序排序
                .sortBy(_._2)(Ordering.Int.reverse)
            }
          )
    
    
        println(groupData1)
    
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    2.3、运行结果

    在这里插入图片描述

    3、小结

    wordcount是所有大数据框架都基本要做的案例,使用scala编写的wordcount代码对比hadoop更简洁更易写
    这主要是对scala集合中功能函数的熟悉与使用

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    S2B2C商城系统平台功能模块分析,加速医药制造企业数字化转型落地
    Fourier变换的微分性质及其证明
    快速学会HCIA基础
    48. 旋转图像
    day27-过滤器Filter02
    k8s----11、service
    自动化安装脚本(Ansible+shell)
    ora-00439 未启用 bit-mapped indexes
    共享汽车管理|基于SprinBoot+vue的共享汽车管理系统(源码+数据库+文档)
    巨子生物在香港上市:薇娅突击入股,范代娣、严建亚夫妇提前套现
  • 原文地址:https://blog.csdn.net/m0_59092234/article/details/126114040