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()
  }
}

猜你喜欢

转载自blog.csdn.net/LJ2415/article/details/85234807