Spark學習進度7-綜合案例

清風紫雪發表於2021-01-10

綜合案例

檔案排序

 

 解法:

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表:

 

 最終輸出: