一、简介
Flink在处理无界数据流时,也可以切分数据流来得到有限的数据集进行处理,即有界流。而windows,就是它的切分方式,它会把数据流分发到有限大小的bucket(桶)种进行分析。其中,可以分为两种window类型,即时间窗口和计数窗口。
window类型 | 细分类型 | 备注 |
---|
时间窗口 | 滚动时间窗口 | 最简单的窗口类型,按照时间切分成一个一个的窗口 | | 滑动时间窗口 | 它会进行滑动,每次滑动的步长可以设定,窗口之间可以有重叠 | | 会话窗口 | 前后会话相隔一定的时间,则划分一个窗口 | 计数窗口 | 滚动计数窗口 | 达到一定数量就划分一个窗口 | | 滑动计数窗口 | 滑动进行统计,比如每隔一分钟统计过去24小时购买数据 |
二、代码
package com
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.assigners.{EventTimeSessionWindows, ProcessingTimeSessionWindows, SlidingProcessingTimeWindows, TumblingEventTimeWindows, TumblingProcessingTimeWindows}
import org.apache.flink.streaming.api.windowing.time.Time
object TumblingWindow {
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val ds: DataStream[String] = env.socketTextStream("127.0.0.1", 9999)
val result: DataStream[(String, Int)] = ds.flatMap(_.split(" "))
.filter(_.nonEmpty)
.map((_, 1))
.keyBy(0)
.countWindow(10, 5)
.sum(1)
result.print()
env.execute("window demo")
}
}
使用netcat工具,windows平台使用nc -lp 9999 ,linux使用nc -lk 9999 进行测试。
三、备注
flink还提供了很多窗口调用,根据需要进行使用,可以在源码种查看。
|