有狀態轉化操作WindowOperations

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 的操作還有如下方法:

(1)window(windowLength, slideInterval): 基於對源 DStream 窗化的批次進行計算返回一個新的 Dstream;
(2)countByWindow(windowLength, slideInterval): 返回一個滑動窗口計數流中的元素個數;
(3)reduceByWindow(func, windowLength, slideInterval): 通過使用自定義函數整合滑動區間流元素來創建一個新的單元素流;
(4)reduceByKeyAndWindow(func, windowLength, slideInterval, [numTasks]): 當在一個(K,V)對的 DStream 上調用此函數,會返回一個新(K,V)對的 DStream,此處通過對滑動窗口中批次數據使用 reduce 函數來整合每個 key 的 value 值。
(5)reduceByKeyAndWindow(func, invFunc, windowLength, slideInterval, [numTasks]): 這個函數是上述函數的變化版本,每個窗口的 reduce 值都是通過用前一個窗的 reduce 值來遞增計算。通過 reduce 進入到滑動窗口數據並”反向 reduce”離開窗口的舊數據來實現這個操作。一個例子是隨着窗口滑動對 keys 的“加”“減”計數。通過前邊介紹可以想到,這個函數只適用於”可逆的 reduce 函數”,也就是這些 reduce 函數有相應的”反 reduce”函數(以參數 invFunc 形式傳入)。如前述函數,reduce 任務的數量通過可選參數來配置。

countByWindow()和 countByValueAndWindow()作爲對數據進行計數操作的簡寫。

countByWindow()返回一個表示每個窗口中元素個數的 DStream,而 countByValueAndWindow()返回的 DStream 則包含窗口中每個值的個數。
val ipDStream = accessLogsDStream.map{entry => entry.getIpAddress()}
val ipAddressRequestCount = ipDStream.countByValueAndWindow(Seconds(30), 
Seconds(10)) 
val requestCount = accessLogsDStream.countByWindow(Seconds(30), Seconds(10))

 

 

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