?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424152.html
目錄
?
WordCount案例:
需求分析與步驟:
拆分:
聚合:
格式轉(zhuǎn)化:
方法1:
方法2:
排序:
方法1:
方法2:
取top3:
整體化簡(jiǎn)后的代碼:
WordCoount案例升級(jí):
給定數(shù)據(jù):
方法1:
方法2:
方法3:
并行集合:
?
WordCount案例:
需求分析與步驟:
拆分:
val list: List[String] = stringList.flatMap((s) => {
s.split(" ")
})
聚合:
聚合過(guò)程較為繁瑣,分為以下幾步:
(1)先將切割后的List集合轉(zhuǎn)變成二元組并且value設(shè)置為1
val tuples: List[(String, Int)] = list.map(s => (s, 1))
(2)對(duì)現(xiàn)在的二元組進(jìn)行分組(相同的key)
val map: Map[String, List[(String, Int)]] = tuples.groupBy(tuple => tuple._1)
格式轉(zhuǎn)化:
方法1:
通過(guò)map映射映射成我們需要的形式
val map1: Map[String, Int] = map.map(tuple => (tuple._1, tuple._2.size))
方法2:
方法2使用的是value特定的函數(shù)
val map2: Map[String, Int] = map.mapValues(value => value.size)
排序:
方法1:
現(xiàn)在的集合是Map集合,需要排序所以要轉(zhuǎn)換成List再調(diào)用排序函數(shù)(sortBy方法)
val list1: List[(String, Int)] = map2.toList
val tuples1: List[(String, Int)] = list1.sortBy(map1 => map1._2).reverse
方法2:
采用sortWith方法:
val list2: List[(String, Int)] = list1.sortWith((map1l, map2r) => map1l._2 > map2r._2)
取top3:
val list3: List[(String, Int)] = list2.take(3)
整體化簡(jiǎn)后的代碼:
val tuples1: List[(String, Int)] = stringList.map(_.split(" "))
.flatten
.map(s => (s, 1))
.groupBy( _._1)
.map(tuple => (tuple._1, tuple._2.size))
.toList
.sortBy(_._2)(Ordering[Int].reverse)
.take(3)
WordCoount案例升級(jí):
給定數(shù)據(jù):
val tupleList = List(("Hello Scala Spark World", 4), ("Hello Scala Spark", 3), ("Hello Scala", 2), ("Hello", 1))
與上述數(shù)據(jù)不同
方法1:
方法一就是把數(shù)據(jù)打散變成普通版數(shù)據(jù)再按照普通版數(shù)據(jù)進(jìn)行操作
(1)切割與扁平化:
val list1: List[String] = list.flatMap(s => {
s.split(" ")
})
(2)將集合中方法都改變結(jié)構(gòu)變成二元組(value=1)
val tuples: List[(String, Int)] = list1.map(s => (s, 1))
(3)按照key進(jìn)行分組
val map: Map[String, List[(String, Int)]] = tuples.groupBy(tup => tup._1)
(4)通過(guò)map進(jìn)行格式轉(zhuǎn)換成最終格式
val list2: List[(String, Int)] = map.map(tp => (tp._1, tp._2.size))
(5)轉(zhuǎn)換成List集合并且進(jìn)行排序取前三(按業(yè)務(wù)要求)
.toList
.sortWith((tpl, tpr) => tpl._2 > tpr._2)
.take(3)
總結(jié):上述方法理解簡(jiǎn)單,但是比較消耗內(nèi)存? 當(dāng)每個(gè)字符串的次數(shù)較大時(shí) 是非常消耗內(nèi)存的,消耗時(shí)間
方法2:
方法2采取的是不打散策略,直接使用聚合的策略
(1)對(duì)集合進(jìn)行切割并且轉(zhuǎn)換成元組(key,value)
val list3: List[List[(String, Int)]] = tupleList.map(s => {
val strings: Array[String] = s._1.split(" ")
val list: List[String] = strings.toList
list.map(list => {
(list, s._2)
})
}
)
(2)進(jìn)行扁平化
val flatten: List[(String, Int)] = list3.flatten
(3)進(jìn)行分組
val map1: Map[String, List[(String, Int)]] = flatten.groupBy(tuple => tuple._1)
(4)對(duì)value值進(jìn)行改變? 改變?yōu)槲覀冃枰母袷?/p>
val map2: Map[String, Int] = map1.mapValues(value => value.map(tuple => tuple._2).sum)
方法3:
?方法3是在我們分組的基礎(chǔ)之上對(duì)value進(jìn)行調(diào)用歸約函數(shù),直接對(duì)value進(jìn)行累加
val map3: Map[String, Int] = map.mapValues(value => value.foldLeft(0)((res, elem) => res + elem._2))
并行集合:
并行集合涉及多線程文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-424152.html
集合終于終結(jié)了!?。。?!
?
到了這里,關(guān)于Scala之集合(3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!