🙆♂️🙆♂️ 写在前面
🏠 个人主页:
📚 推荐专栏:客户管理系统开发定制更多专栏尽在主页!
📖 本期文章:编程实战 —— 客户管理系统开发定制一文学会编码大数据基础案例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进行映射则可以这样写
// 使用mapval 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 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、聚合 wordcountval 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 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) }}
- 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集合中功能函数的熟悉与使用