背景:
窗口函数包括2部分,一个是窗口长度,一个是滑动长度。
我们知道,SparkStreaming和Storm完全实时不同,它是每隔一段时间搞一次的,比如是5秒。
因此这里就产生3个概念:间隔、窗口长度、滑动距离
间隔:比如为5s,代表的是无论怎么样,SparkStreaming每5s从源处获取一次数据进行处理,至于展示不展示,这个它不管,因为这是由窗口函数决定的
窗口长度:就是每次展示时,到底显示几个间隔里面的内容。假如窗口长度设置为10s,则显示最近2个间隔里面的数据
滑动距离:就是到底在几个间隔后开始展示。注意滑动距离最好小于等于窗口长度,否则就会显示不全数据。注意:滑动长度也必须是间隔的整数倍,比如是5s.滑动长度的意思是2次计时的间隔。
为了讲清楚,下面画一个图,假设间隔为5s,一个格式代表5s.那么窗口长度为10s,滑动距离为5s的长度如下
代码如下
package scalapackage.testspark
import org.apache.spark.{HashPartitioner, SparkConf}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Created by Germmy on 2018/6/3.
*/
object WindowsTest {
def main(args: Array[String]) {
val sc=new SparkConf().setAppName("SparkStreamingWC").setMaster("local[2]")
val ssc: StreamingContext = new StreamingContext(sc,Seconds(5))
ssc.checkpoint("hdfs://node01:9000/ck-20180603")//针对SparkStreaming设置的checkpoint,在读文件后设置ck也可以
val textStream: ReceiverInputDStream[String] = ssc.socketTextStream("192.168.92.142",8888)
val dStream: DStream[(String, Int)] = textStream.flatMap(_.split(" ")).map((_,1))
val key: DStream[(String, Int)] = dStream.reduceByKeyAndWindow((a:Int,b:Int)=>a+b,Seconds(10),Seconds(30))
key.print(10)
ssc.start()
ssc.awaitTermination()
}
}