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

‍♂️‍♂️ 写在前面

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


本文目录

  • Scala开发实战练习
    • 1、Word count案例实战
      • 1.1、word count 过程分析
      • 1.2、代码实现过程
      • 1.3、编码实现
      • 1.4、wordcount进阶
    • 2、需求实战
      • 2.1、需求分析
      • 2.2、编码实现
      • 2.3、运行结果
    • 3、小结


Scala开发实战练习

1、Word count案例实战

1.1、word count 过程分析

Scala编程实战 —— 一文学会编码大数据基础案例wordcount_第1张图片

1.2、代码实现过程

// TODO 1、读取文件 获取原始数据

// TODO 2、扁平化 将原始数据拆分为一个个单词

// TODO 3、对单词进行分组操作

// TODO 4、对分组后的数据进行数量的统计

// TODO 5、将统计结果打印

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)

  }
}

Scala编程实战 —— 一文学会编码大数据基础案例wordcount_第2张图片

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

// 使用map
val count = wordGroup.map(
  t => {
    val k = t._1
    val v = t._2
    (k, v.size)
  }
)

写法二:

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.4、wordcount进阶

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

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

需求还是统计wordcount

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

方法一:

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

Scala编程实战 —— 一文学会编码大数据基础案例wordcount_第3张图片

编码:

// 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)

Scala编程实战 —— 一文学会编码大数据基础案例wordcount_第4张图片

方法二:

将数据转换为 (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)
}

2、需求实战

2.1、需求分析

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

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

Scala编程实战 —— 一文学会编码大数据基础案例wordcount_第5张图片

2.2、编码实现

package com.zhou.scala.chapter6

/**
 * @author it春和
 * @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)

  }
}

2.3、运行结果

在这里插入图片描述

3、小结

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

你可能感兴趣的:(Scala,scala,spark,big,data,大数据,开发语言)