spark的計算器與廣播變數

yunqiublog發表於2019-07-25

一.計算器

1.官網

2.解釋


計數器只支援加,計算器字task裡面

3.測試

4.結果截圖WEBUI

4.應用場景


資料很多有的資料掛了,做資料質量監控用

二.廣播變數

1.官網

2.join程式碼


 def commonJoin(sc:SparkContext): Unit = {
    val peopleInfo = sc.parallelize(Array(("G301","糊塗蟲"),("G302","森老"),("G303","Gordon"))).map(x=>(x._1, x))
    val peopleDetail = sc.parallelize(Array(("G301","清華大學",18))).map(x=>(x._1,x))
    // TODO... 大表關聯小表  join  key   from a join b on a.id=b.id
    peopleInfo.join(peopleDetail).map(x=>{x._1 + "," + x._2._1._2 + "," + x._2._2._2+ "," + x._2._2._3})
  }

3.結果WEBUI

4.廣播變數使用前提


廣播變數的前提條件是資料量少,一大一小,不能超過記憶體
資料量大小還要看記憶體,你記憶體夠大就可以放
廣播變數放到記憶體中

5.廣播變數的join程式碼


  def broadcastJoin(sc:SparkContext): Unit = {
    val peopleInfo = sc.parallelize(Array(("G301","糊塗蟲"),("G302","森老"),("G303","Gordon"))).collectAsMap()
    val peopleDetail = sc.parallelize(Array(("G301","清華大學",18))).map(x=>(x._1, x))
    // 通過sc將變數廣播出去
    val peopleBroadcast = sc.broadcast(peopleInfo)
    // mappartition: 取出表中的一條記錄和廣播變數中的對比
    peopleDetail.mapPartitions(x=>{
      val map = peopleBroadcast.value  // 是不是就是記憶體的東西
      for((key,value)<-x if (map.contains(key)))
        yield (key,map.get(key).getOrElse(""), value._2)
    }).foreach(println)
  }

6.WEBUI結果

7.兩個join對比


廣播變數的沒有了shuffer
有前提資料量不可以多
把小表廣播到記憶體中,大表每個資料與其對比
有就要,沒有就不要。
廣播變數與join結合工作中常用

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69941978/viewspace-2651740/,如需轉載,請註明出處,否則將追究法律責任。

相關文章