SparkStreaming窗口函數的應用

package windon

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * 背景描述
  * 在社交網(微博),電子商務(淘寶),搜索引擎(百度),股票交易中人們最關係的內容
  * 大家在某段時間中關注的是什麼
  * 這種數據,在企業中非常有價值
  *
  * 例如:我們關注的過去30分鐘大家的熱搜是什麼?
  * 需求:我們需要沒20秒鐘統計一次過去60秒的熱詞
  * 數據格式:  hadoop 20181224
  * 返回格式要求: 熱詞排行前三
  */
object OnlineHotItem {
  def main(args: Array[String]): Unit = {
   //過濾日誌
    Logger.getLogger("org").setLevel(Level.WARN)
    //入口
    val conf = new SparkConf().setAppName("1").setMaster("local[*]")
    val ssc = new StreamingContext(conf,Seconds(5))
    //拉取數據
    val hosItemDStream = ssc.socketTextStream("hadoop01",1234)
    //對數據進行處理,得到想要的數據
    val serachPair = hosItemDStream.map(_.split(" ")(0)).filter(!_.isEmpty).map((_,1))
    //運用窗口函數,第二個參數爲窗口長度,第三個參數爲窗口滑動間隔
    val hotDStream = serachPair.reduceByKeyAndWindow((x:Int,y:Int)=>x+y,Seconds(60),Seconds(20))
  //利用transform算子獲取前三的排序熱詞
   val result= hotDStream.transform(rdd=>{
      val top3 = rdd.map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(3)
      ssc.sparkContext.makeRDD(top3)
    })
    result.print()

    ssc.start()
    ssc.awaitTermination()
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章