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

// TODO 1、读取文件 获取原始数据
// TODO 2、扁平化 将原始数据拆分为一个个单词
// TODO 3、对单词进行分组操作
// TODO 4、对分组后的数据进行数量的统计
// TODO 5、将统计结果打印
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)
}
}

如果非要使用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)
}
}
假如给的数据不是那样的呢?
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)

方法二:
将数据转换为 (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)
}
需求:统计不同省份的商品点击排行
分析:不同省份为key 商品点击排行为value

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

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