集合常用函数
一、集合基本方法
var list = List(1,2,3,4)
list.sum //求和
list.max//求最大值
list.min//求最小值
list.product//求乘积
list.reverse//反转
二、高级函数初识【groupBy】
高阶函数: 内部持有当前集合的引用,内部迭代把迭代的每个元素、给我们自己定义的函数,我们可以对集合中的每个元素做操作了
var list = List(1,2,2,3,3,3,4,4,4,4)
val intToInts: Map[Int, List[Int]] = list.groupBy(t=>t)
intToInts.foreach(t=>println(t._1 +"-"+t._2 + ";"))
三、高阶函数(groupBy)按照首字母进行分组
var list=List("Great","minds","have","purpose","others","have","wishes")
var charToString=list.groupBy(i=>i.charAt(0))
var stringToString=list.groupBy(i=>i.substring(0,1))
println(charToString)
println(stringToString)
四:对List列表的奇偶数进行分组
var list: List[Int] = List(1,2,3,4)
val booleanToInts= list.groupBy(i=>i%2==0)
五、高阶函数sortWith(指定规则进行排序)
var list= List(5,6,1,2,3,4)
val ints= list.sortBy(x=>x)
val ints= list.sortWith((x,y)=>x>y)
val ints= list.sortWith((x,y)=> {
println(x+"-"+y)
x>y
})
六、简易版本WordCount
var list=List(...)
var tuple=list.map(x=>(x,1))
var stringToTuples=tuple.groupBy(x=>x._1)//分组
var intToInts=stringToTuples.map((x=>(x._1,x._2.size)))//统计
七、flatmap / fliter / zip 等函数的使用
zip:
var list1= List(1,2,3)
var list2 = List(4,5,6)
val tuples: List[(Int, Int)] = list1.zip(list2)
union:
var list1= List(1,2,3)
var list2 = List(1,2,4)
val ints= list1.union(list2) // 列表合并
集合:
val ints= list1.intersect(list2)//交集
val ints= list1.diff(list2)//差集
filter(过滤器):
val list = List(1,2,3,4)
val filterRDD= list.filter(x=>true)
filterRDD.foreach(t=>println(t))
flatMap 扁平化 数组里面的值的类型作为泛型
val list: List[String] = List("hello A","hello B","hello C")
val flatMapRDD: List[String] = list.flatMap(x=>x.split(" "))
val groupByRDD: Map[String, List[String]] = flatMapRDD.groupBy(word=>word)
groupByRDD.map(t=>(t._1,t._2.size)).foreach(println)
// 单词出现次数最多的前Top3
var wordList: List[String] = List(...)
// 按照单词进行分组
val groupByRDD= wordList.groupBy(word=>word)
// 单词进行计数
val mapRDD= groupByRDD.map(t=>(t._1,t._2.size))
//按出现次数排序
val sortWithRDD= mapRDD.toList.sortWith((a,b)=>a._2 > b._2)
//取前3
val result: List[(String, Int)] = sortWithRDD.take(3)
八、WordCount加强版
var lineList: List[(String, Int)] = List(...)
//拆分
val flatMapRDD= lineList.flatMap(t => {
val line= t._1
val words= line.split(" ")
val mapRDD= words.map(w => (w, t._2))
mapRDD
})
//组合
val groupByRDD= flatMapRDD.groupBy(t=>t._1)
//合并计算
val finalMapRDD= groupByRDD.map(t => {
val countList= t._2.map(tt => tt._2)
(t._1, countList.sum)
})
//输出
finalMapRDD.foreach(println)
案例一:WordCount2.0
var list= List(("hello A",4),("hello B",3))
val flatMapRDD= list.flatMap(t => {
val mapRDD=t._1.split("\\s+").map(w => (w, t._2)) //"\\s+"匹配多个空格
mapRDD
})//分别按各个单词统计次数
val groupByRDD= flatMapRDD.groupBy(t=>t._1)//分组
val stringToInt= groupByRDD.mapValues(datas=>datas.map(t=>t._2).sum)//求和
for (i<-stringToInt)
mapValues高阶函数
【对象类型的泛型:Map类型】
【只对集合中value做操作、key保持不变】
一般用于分组求最大、最小、均值、求和
案例二:reduce (聚合、规约)
var list=List(1,2,3,4)
var res1=list.reduce((l,r)=>l+r)
var res2=list.reduce(_+_)