Window Operations 可以設置窗口的大小和滑動窗口的間隔來動態的獲取當前 Steaming 的允許狀態。所有基於窗口的操作都需要兩個參數,分別爲窗口時長以及滑動步長。
➢ 窗口時長:計算內容的時間範圍;
➢ 滑動步長:隔多久觸發一次計算。
注意:這兩者都必須爲採集週期大小的整數倍。
object WindowOperationsDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordcount")
val sc = new StreamingContext(conf, Duration(3000))
sc.checkpoint("ck/")
val lineDs: ReceiverInputDStream[String] = sc.socketTextStream("localhost", 8888)
val wordMap: DStream[(String, Int)] = lineDs.flatMap(_.split(" ")).map((_, 1))
//加上新進入窗口的批次中的元素 //移除離開窗口的老批次中的元素 //窗口時長// 滑動步長
val Sum: DStream[(String, Int)] = wordMap.reduceByKeyAndWindow((x,y)=>x+y,(x,y)=>x-y,Duration(6000),Duration(3000))
Sum.print()
sc.start()
sc.awaitTermination()
}
}
關於 Window 的操作還有如下方法:
countByWindow()和 countByValueAndWindow()作爲對數據進行計數操作的簡寫。
val ipDStream = accessLogsDStream.map{entry => entry.getIpAddress()} val ipAddressRequestCount = ipDStream.countByValueAndWindow(Seconds(30), Seconds(10)) val requestCount = accessLogsDStream.countByWindow(Seconds(30), Seconds(10))