wordCount
package com.doit.day03
import scala.io.{BufferedSource, Source}
object WordCountDemo {
def main(args: Array[String]): Unit = {
//读取文件,获取到一个Source目标
val source: BufferedSource = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\word.txt")
//调用getLines办法,获取到每一行数据,每一行数据都放在迭代器中
val lines: Iterator[String] = source.getLines()
//假如我现在直接这么回来,他的回来值是什么?? Iterator[String] ==》 相同的回来一个迭代器,迭代器里边放得是Array[String] 数组里边每一个元素放得都是一个个的单词
val arrWord: Iterator[Array[String]] = lines.map(line => {
//1.需要将每一行数据拿出来进行切开,变成一个个的单词
//hello hadoop hive
val wordsArr: Array[String] = line.split("\\s+")
wordsArr
})
//将迭代器转化成了调集
val list: List[Array[String]] = arrWord.toList
//将list中的array压平,这样list装的便是每一个单词了
val word: List[String] = list.flatten
//对每一个单词进行分组,相同的单词分在一组,key便是单词,value是一个list,一切相同的单词都放在这个list中
val wordAndList: Map[String, List[String]] = word.groupBy(word => word)
//转化,将list转化成长度,长度便是单词的个数
val wordCount: Map[String, Int] = wordAndList.map(tup => (tup._1, tup._2.size))
//检查成果
println(wordCount)
}
}
均匀温度事例
package com.doit.day03
/**
* 需求:求最近几天每个城市的均匀温度
*/
object AvgTem {
def main(args: Array[String]): Unit = {
val d1 = Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 31.0))
val d2 = Array(("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3))
val d3 = Array(("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.0))
//1.将一切的数据都放在一个数组或许调集中
val allData: Array[(String, Double)] = d1 ++ d2 ++ d3
//Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 33.1),("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3),("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.1))
//依照城市分组
val grouped: Map[String, Array[(String, Double)]] = allData.groupBy(tp => tp._1)
//方法一,获取到一切的温度,sum求和后求均匀
val res: Map[String, Double] = grouped.map(tp => {
//数组中每一个元素的key都是相同的,仅仅温度不相同,现在需要将整个数组转化成城市,均匀温度
val value: Array[(String, Double)] = tp._2
val avg: Double = value.map(_._2).sum / value.length
(tp._1, avg)
})
println(res)
//方法二,只对value进行处理
val res1: Map[String, (String, Double)] = grouped.mapValues(tp => {
val avg: Double = tp.reduce(_._2 + _._2) / tp.length
(tp(0)._1, avg)
})
}
}
一起老友事例
package com.doit.day03
import scala.io.{BufferedSource, Source}
/**
* 数据如下 :每个字母代表一个人 , 计算恣意一个人和其他人的一起老友
* A:B,C,D,F,E,O
* B:A,C,E,K
* C:F,A,D,I
* D:A,E,F,L
* E:B,C,D,M,L
* F:A,B,C,D,E,O,M
* G:A,C,D,E,F
* H:A,C,D,E,O
* I:A,O
* J:B,O
* K:A,C,D
* L:D,E,F
* M:E,F,G
* O:A,H,I,J
*/
object SameFriends {
def main(args: Array[String]): Unit = {
val lines: Iterator[String] = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\friends").getLines()
val myAndFriends: List[(String, Array[String])] = lines.toList.map(line => {
// A:B,C,D,F,E,O :前面的是我自己,:后边的是我的朋友们
val arr: Array[String] = line.split(":")
//获取到我自己
val user: String = arr(0)
//获取到我的朋友们,朋友们都放在数组里边,里边的元素便是一个个的朋友目标
val friends: Array[String] = arr(1).split(",")
(user, friends)
})
//获取一起老友。。。
for(i <- 0 until myAndFriends.length){
for(j <- i+1 until myAndFriends.length){
//从第一个元素开端取
val tuple: (String, Array[String]) = myAndFriends(i)
val tuple1: (String, Array[String]) = myAndFriends(j)
//看是不是有一起老友,是不是取交集
val sameFriends: Array[String] = tuple._2.intersect(tuple1._2)
println("用户:"+tuple._1+"用户:"+tuple1._1+"的一起老友是:"+sameFriends.mkString(","))
}
}
}
}