1.需求
统计每个单词出现的字数
"hello rose"
"hello kevin rose"
"hello jack"
2. 读文件
用换行符分割读文件,得到如下内容
Array("hello rose","hello kevin rose","hello jack")
3. 用scala实现wordCount
- 用空格分割单词
scala> lines.map(_.split(" "))
res1: Array[Array[String]] = Array(Array(hello,rose),Array(hello,kevin,rose),Array(hello,jack))
- 使用flat把所有单词放到一个数组中
scala> lines.map(_.split(" ")).flatten
res2: Array[String] = Array(hello,rose,hello,kevin,rose,hello,jack)
- 每个单词计数1
scala> lines.map(_.split(" ")).flatten.map((_,1))
res3: Array[(String,Int)] = Array((hello,1),(rose,1),(hello,1),(kevin,1),(rose,1),(hello,1),(jack,1))
- 根据出现的单词分组
scala> lines.map(_.split(" ")).flatten.map((_,1)).map(_._1)
res4: scala.collection.immutable.Map[String,Array[(String, Int)]] = Map(jack ->
Array((jack,1)), rose -> Array((rose,1), (rose,1)), kevin -> Array((kevin,1)),
hello -> Array((hello,1), (hello,1), (hello,1)))
- 进行count,Map当成特殊的元组,t._1为要进行count的单词,t._2为Array。Array.size为单词出现的次数
scala> lines.map(_.split(" ")).flatten.map((_,1)).groupBy(_._1).map(t=>(t._1,t._
2.size))
res5: scala.collection.immutable.Map[String,Int] = Map(jack -> 1, rose -> 2, ke
vin -> 1, hello -> 3)
- 按照单词出现的次数排序,由于map不能进行排序,所有需要先转换成list
scala> lines.map(_.split(" ")).flatten.map((_,1)).groupBy(_._1).map(t=>(t._1,t._
2.size)).toList.sortBy(_._2)
res6: List[(String, Int)] = List((jack,1), (kevin,1), (rose,2), (hello,3))
4. mapValues来进行单词计数
- 在上面第四步的时候按照单词分组之后,不在需要对key进行操作了,只需要对value进行计数就可以了。所以使用mapValues来进行优化。
hello -> Array((hello,1), (hello,1), (hello,1))
- 对分组后的数据进行分析,调用了mapValues。
mapValues(_.fold Left(0)((x,y)=>x+y._2))
.那么参数中的第一个_
表示的就是Array.对array中的值进行叠加,调用fold
。fold
有2个参数,第一个参数是初始值,第二个参数为一个函数_+_._2
,也就是(x,y)=>x+y
,x为初始值。y为array的元素也就是元组(hello,1)
scala> lines.map(_.split(" ")).flatten.map((_,1)).groupBy(_._1).mapValues(_.fold
Left(0)((x,y)=>x+y._2))
res34: scala.collection.immutable.Map[String,Int] = Map(jack -> 1, rose -> 2, ke
vin -> 1, hello -> 3)