实现案例前需要熟悉scala中集合的几个高级函数:

  1. 映射:集合.map() 即拿到集合中元素做某些处理,返回当前集合的类型。
  2. 扁平化:集合.flatten() 就是提取外层集合中的内层集合中的元素,打散放入到外层集合中。
  3. 映射和扁平化可以写成一个函数:集合.flatMap()。
  4. 分组:集合.groupBy()函数:根据集合中元素的某个特征进行分组,返回值类型:Map(any -> List[any])
  5. 排序:一般List.sorted() 、List.sortBy()、 List.sortWith() ; List.sorted: 可以不指定参数,会按照集合中的元素进行自然排序。List.sortBy()():参数为函数类型:需传入一个元素,可以根据元素某个特征进行排序,如需按照倒序排序,可以在第二个参数列表中传入:Ordering[any].reverseList.sortWith():参数也为函数类型:需要传入两个元素,参数的函数体需返回一个boolean类型。
  6. 折叠: 集合.foldLeft()()函数,下面解释。
  7. 简化规约:集合.reduce()函数,相比 fold()()方法少了一个初始值参数列表。

​ 对于6. 7. 中介绍的 fold()(),reduce() 方法,可以通过下面这个合并两个map的案例,进行深入理解:

foldleft()()函数源码解析 :
 override /*TraversableLike*/def foldLeft[B](z: B)(@deprecatedName('f) op: (B, A) => B): B = {var acc = z                        //累计变量acc 初始值即为第一个参数var these = thiswhile (!these.isEmpty) {       //序列的长度不为零acc = op(acc, these.head)        //每次取一个头元素放入传进来的函数进行处理,并将结果赋给累计变量these = these.tail             //除了头就是尾}acc                                //最终将累计变量返回}
通过源码可以看出集合的折叠方法为多阶函数(函数柯里化)
第一个参数列表为: 初始值
第二个参数列表为: 可以理解为简化的规则:将集合的元素做何种处理,一般都是传一个lambda表达式
函数测试:
  //fold(),foldLeft(),foldRight()方法测试@Testdef test_foldMethod(): Unit = {val list1 = List(9, 2, 5, 7)println(list1.foldLeft(10)((acc, elem) => acc + elem)) //会处理后的结果保存在acc中//可以简写为println(list1.fold(10)(_ + _)) //进行累加         执行过程为:10 + 9 + 2 + 5 + 7println(list1.fold(10)(_ - _)) //执行过程为     10 - 9 - 2 - 5 - 7//fold()底层调用了foldLeft()这里就不进行测试了//foldRight() 方法的执行过程与foldLeft()方法并不相同,可以理解为初始值从右边与元素进行简化处理println(list1.foldRight(10)(_ - _)) //  9 - (2 - (5 - (7 - 10)))}@Testdef Test_reduceMethod(): Unit = {//简化规约:集合.reduce()方法,相比fold()()方法少了一个初始值参数列表val list1 = List(9, 2, 5, 7)println(list1.reduceLeft(_ - _)) //9 - 2 - 5 - 7println(list1.reduceRight(_ - _)) //(9 - (2 - (5 - 7)))}

合并两个map集合

@Test
def Test_MergeMap(): Unit = {//在工作中,我们往往有合并两个map集合的需求,即:合并相同key的value,而不是进行覆盖操作//在scala语言中,我们可以使用集合.fold()()方法对集合进行处理val map1 = mutable.Map("hello" -> 3, "word" -> 5)val map2 = mutable.Map("hello" -> 4, "scala" -> 4)//使用折叠方法: 集合.foldLeft()()方法//将map1作为初始值,map1会先赋给accMap累计变量,为初始值val stringToInt = map2.foldLeft(map1)((accMap, kv) => {//先取出map2中的key/value,通过二元组取元素的方式val key = kv._1val value = kv._2// 使用getOrElse()方法判断集合中是否有相同key 的键值对,该方法返回值:有key就返回value,没有就返回0//更新accMap并返回accMap(key) = accMap.getOrElse(key, 0) + valueaccMap})println(stringToInt)
}

普通WordCount案例

1)需求

​ 单词计数:将集合中出现的相同的单词,进行计数,取计数排名前三的结果

2)主要使用map()、groupBy()、 sortBy()、 take()函数

代码实现:

@Testdef simpleWordCount(): Unit = {// 1. 简单的wordCountval lineDatas = List("hello java","hello scala","hello world","hello spark","hello flink","hello spark flink form scala")val strings = Array("hello world")strings.map(_.split(" "))val flatMapList=lineDatas.flatMap(_.split(" "))//这种情况比较简单,可以直接使用映射方法,直接操作集合中的元素即可val resultMap = flatMapList.groupBy(word => word).map(kv => (kv._1,kv._2.length))// 提取top Nprintln(resultMap.toList)    //List((world,1), (java,1), (flink,2), (spark,2), (scala,2), (hello,6), (form,1))//根据value进行降序排序println(resultMap.toList.sortBy(kv => kv._2)(Ordering[Int].reverse).take(3))}

复杂WordCount案例

代码实现:

@Test
def Test_complexWordCount(): Unit ={// 二、复杂版本//数据由二元组形成的List。_2:表示这行句子出现的次数val lineCountTupleList: List[(String, Int)] = List(("hello", 1),("hello world", 2),("hello scala", 3),("hello spark from scala", 4))// 第一种做法:直接将单词和次数转化为对应次数的单词val resultMap = lineCountTupleList.map(elem => (elem._1 + " ") * elem._2).flatMap(_.split("\\s+")).groupBy(word => word).map(kv => (kv._1, kv._2.size)).toList.sortWith(_._2 > _._2).take(3)println(resultMap)//推荐做法:// 第二种做法:将元集合中的二元组转化为(单词,次数)的形式,在进行统计// 使用map()函数拿到集合中的元素val newList: List[Array[(String, Int)]] = lineCountTupleList.map(kv => {val wordsArr = kv._1.split("\\s+")//对数组中元素重新组合 => Array[(String,Int)] 数据类型为二元组的数组wordsArr.map(word => (word, kv._2)) //返回})//newList.foreach(_.foreach(print))//扁平化List集合中的数组集合val flattenList:List[(String, Int)] = newList.flatten//分组:将相同单词的二元组分成//println(flattenList.groupBy(_._1))//统计val resultList: List[(String, Int)] = flattenList.groupBy(_._1).map(kv => {val value = kv._2(kv._1, value.map(_._2).sum)}).toList.sortBy(_._2)(Ordering[Int].reverse).take(3)println(resultList)
}

Scala语言实现WordCount案例以及几个高级函数的使用总结相关推荐

  1. 使用scala语言实现wordcount程序

    使用scala语言实现wordcount(统计单词出现的次数): object WordCount {def main(args: Array[String]): Unit = {val lines ...

  2. 使用scala轻松完成wordcount统计案例

    之前使用java疯狂写代码,计算单词的个数,之后又编写mr程序处理,统计单词个数,可代码还是多,今天就使用强大的scala语言来进行编程,统计单词的个数. 有数据 "scala,Spark, ...

  3. Scala语言学习一——基础语法

    什么是 Scala Scala 是一种多范式的编程语言, 其设计的初衷是要集成面向对象编程和函数式编程的各种 特 性 . Scala 运 行 于 Java 平 台 (Java 虚 拟 机 ) , 并 ...

  4. Spark快速上手-WordCount案例

    在此之前,我已经用MapReduce 框架实现了WordCount案例,接下来,我开始学习数据处理的另外一个非常重要的方法:Spark.首先,使用WordCount案例实现Spark快速上手. 创建M ...

  5. Apache Spark学习:利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可以阅读网络教程 A Scala Tutorial for Ja ...

  6. 第四课 尚硅谷Scala语言学习-面向对象

    第四课 尚硅谷Scala语言学习-面向对象 文章目录 第四课 尚硅谷Scala语言学习-面向对象 第一节 Scala 包 1.1 包基本语法 1.2 包说明 1.3 包对象 1.4 导包说明 第二节 ...

  7. 13:Scala语言的数据结构和算法

    第十九章 Scala语言的数据结构和算法 19.1 数据结构(算法)的介绍 数据结构的介绍   1.数据结构是一门研究算法的学科,只从有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮.更加 ...

  8. Scala核心编程 第一章—Scala语言概述

    一.Scala语言解释 1.什么是Scala语言 Spark-新一代内存级大数据计算框架,是大数据的重要内容. Spark就是使用Scala编写的.因此为了更好的学习Spark, 需要掌握Scala这 ...

  9. Spark基础【介绍、入门WordCount案例】

    文章目录 一 概述 0 Spark和Hadoop的关系 (1)从时间节点上来看 (2)从功能上来看 1 Hadoop 0.x 1.x的问题 2 Hadoop 2.x 3 Spark 4 Spark 和 ...

最新文章

  1. mendix归还界面如何只显示登录人自己借阅的书籍,而不显示全部人借阅的书籍
  2. 一个关于linux文件预读机制问题
  3. Java 摄氏和华氏之间的转换
  4. linux内核双向循环队列,读书笔记之linux内核设计与实现(2)进程调度
  5. Ncurses 命令行图形库
  6. 【CAD】自定义实体的步骤(转)
  7. 学生信息管理系统——C语言版
  8. ArcGis 拓扑检查——狭长角锐角代码C#
  9. Python 爬虫案例(一)
  10. Nutch开发(一)
  11. 数据分析 超市条码_超市卖场管理四要素!走好千里之行的第一步!
  12. 个人开发者上架Android应用市场感受
  13. Linux中ps命令 ps aux与ps -ef的区别
  14. 【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享
  15. WIFI手机将登陆上海 打国际长途每分钟0.3元
  16. Python停车管理系统毕业设计-附源码271400
  17. ps aux 命令和 top命令
  18. MySQL错误–超出了“ max_questions”资源(当前值:1000)
  19. 【成功智慧】012.要有耐心去等待成功的到来
  20. HTML img标签识别base64图片格式

热门文章

  1. 机器学习算法—决策树(ID3)算法
  2. sleep与select函数
  3. 应用程序无法启动,因为应用程序的并行配置不正确 解决备忘
  4. 简述HTTPS中间人攻击
  5. 身份证信息泄露的危险,你知道吗?简单一招就能查询
  6. Mac小技巧 强制退出程序的六种方法
  7. java常用的中间件简介
  8. shell 编程之流程控制语句详解
  9. 【计算机图形学】 圆的两种生成算法(角度微分法、Bresenham算法)
  10. 三国1:保姆级《三国演义》主要人物分析