綜合案例
檔案排序
解法:
1.讀取資料
2.資料清洗,變換資料格式
3.從新分割槽成一個分割槽
4.按照key排序,返還帶有位次的元組
5.輸出
@Test
def filesort(): Unit ={
val source=sc.textFile("dataset/filesort.txt",3)
var index=0
/*
partitionBy:把所有的分割槽相關的資料組成一個新的分割槽
HashPartitioner(1):分成一個分割槽,使得在一個分割槽內總體有序
*/
val result= source.filter(_.trim().length>0).map(n => (n.trim.toInt,""))
.partitionBy(new HashPartitioner(1))
.sortByKey().map( t=> {
index+=1
(index,t._1)
})
result.foreach(println(_))
}
二次排序
題目大意:先按照第一個比,相同則按照第二個比
題意思路:
1.讀取資料
2.轉換格式如下
可用圖片展示:
class SecondarySortKey(val first:Int,val second:Int) extends Ordered
[SecondarySortKey] with Serializable{
override def compare(that: SecondarySortKey): Int = {
if(this.first-that.first!=0){
this.first-that.first
}else {
this.second-that.second
}
}
}
//二次排序
@Test
def sortsecond(): Unit ={
val source=sc.textFile("dataset/secondsort.txt",3)
val secondrdd = source.map(item => (new SecondarySortKey(item.split(" ")(0).toInt, item.split(" ")(1).toInt), item))
.partitionBy(new HashPartitioner(1))
secondrdd.sortByKey(false)
.map(item => item._2)
.foreach(println(_))
}
連線操作
案例介紹:
有兩個表:movie表,和score表
score:包含的資訊為:使用者ID,電影ID,電影評分
movie:電影ID,電影名字
我們想要得到,評分超過4分的(電影ID,電影名字,電影評分)
思路如下:
首先先弄score表:
1.獲取想要的資訊
2.獲取對應電影ID的平均值
3.更換格式:keyBy,如下
對於movie表進行連線,連線前需要變化下格式
然後可通過相同的key進行連線join,後的結果如下:
進行評分的過濾,然後取出需要的資料
@Test
/*
score:包含的資訊為:使用者ID,電影ID,電影評分
movie:電影ID,電影名字
*/
def joinTest(): Unit ={
val scoreRDD=sc.textFile("dataset/score.txt")
.map(line => {
val filed=line.split(",")
(filed(1).toInt,filed(2).toDouble)
})
.groupByKey()
.map(data =>{
val avg=data._2.sum/data._2.size
(data._1,avg)
})
.keyBy(it =>it._1)
val movie=sc.textFile("dataset/movie.txt")
.map(line => {
val filed=line.split(",")
(filed(0).toInt,filed(1))
})
.keyBy(it =>it._1)
scoreRDD.join(movie)
.filter(item => item._2._1._2>4.0)
.map(it => (it._1,it._2._2._2,it._2._1._2))
.foreach(println(_))
}
輸出:
score表:
movie表:
最終輸出: