Scala实现wordCount功能——单机版
1.细节语法如下:
- map是操作 是把数组/集合中的每一条拿出来进行操作,究竟如何操作,关键在于map中的参数(参数是函数)
- reduce -> 调用 reduceLeft 是从左往右加
- fold(初始值)(自定义的函数) -> 调用
2.代码如下:
object Test{
def main( args:Array[String]): Unit ={
var lines = Array("wo men shi hao hai zi","wo jiao liu shen","what's your name")
var words = Array("Hello world","Hello scala","Hello bigdata");
/*1.为什么这里使用空格就可以将数组lines分开?
2.这里的map(_.split(" "))可以这么理解,_.split(" ")中的_可以理解成"wo men shi hao hai zi","wo jiao liu shen","what's your name"中每个
冒号的内容,然后将每个冒号的内容用空格分割。
*/
var result1 = words.map(_.split(" "))
/*
1.将这个result1压平,压平的意思就是将多个Array数组压成一个Array数组
*/
var result2 = result1.flatten
/*
1.将result2中的每个元素拿出来和1形成map元组
*/
var result3 = result2.map((_,1))
/*
1.通过每个元组的第一个值来分组
2.这里的分组方法因Scala/Spark等编程语言的不同而不同
3.在scala中是groupBy,但是在spark中就是reduceByKey
4.这里面的result4中的每个元素 都是一个元组
*/
var result4 = result3.groupBy((_._1))
/*
1.这里的t._1中的t指的是元组中的一个元素,t._1指的是元组中第一个元素的第一部分
*/
var result5 = result4.map(t =>(t._1,t._2.length))//唯一不明白的地方
/*
1.将得到的map转换成list,然后将list按照元组的第二部分来降序排序
*/
var result6 = result5.toList.sortBy(_._2).reverse
println(result6);
/**
* 1.flatMap()是通过切分开再压平 切分是通过.split(" ")方法
* 2.map()方法是切分 map((_,1))是形成map序列 每个序列的value都是1
* 3.groupBy()方法分组 groupBy((_._1))是通过每个元组的第一个值来分组
* 4.toList()方法是转化成List序列 因为map是不支持排序的,所以使用List
* 5.sortBy()方法是排序方法 sortBy(_._2)是通过元组的第二个元素来排序
* 6.reverse()方法是倒转 将排序的结果降序排列
* */
}
}
2.运行结果如下:
3.注
- 使用flatten之后不需要添加()