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