一、Flink Window窗口机制:时间窗口TimeWindow:会话窗口(Session Window)
### --- Flink Window窗口机制:时间窗口TimeWindow:会话窗口(Session Window)
~~~ 时间窗口TimeWindow:会话窗口(Session Window)
![](https://i-blog.csdnimg.cn/blog_migrate/5561a80072a25d0cb26c18125599b26c.png)
### --- 会话窗口说明
~~~ 由一系列事件组合一个指定时间长度的timeout间隙组成,类似于web应用的session,
~~~ 也就是一段时间没有接收到新数据就会生成新的窗口。
~~~ session窗口分配器通过session活动来对元素进行分组,session窗口跟滚动窗口和滑动窗口相比,
~~~ 不会有重叠和固定的开始时间和结束时间的情况
~~~ session窗口在一个固定的时间周期内不再收到元素,即非活动间隔产生,那么这个窗口就会关闭。
~~~ 一个session窗口通过一个session间隔来配置,
~~~ 这个session间隔定义了非活跃周期的长度,当这个非活跃周期产生,
~~~ 那么当前的session将关闭并且后续的元素将被分配到新的session窗口中去。
### --- 特点
~~~ 会话窗口不重叠,没有固定的开始和结束时间
~~~ 与翻滚窗口和滑动窗口相反, 当会话窗口在一段时间内没有接收到元素时会关闭会话窗口。
~~~ 后续的元素将会被分配给新的会话窗口
### --- 案例描述
~~~ 计算每个用户在活跃期间总共购买的商品数量,如果用户30秒没有活动则视为会话断开
二、编程代码实现
### --- 编程代码实现
package com.yanqi.window;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.datastream.WindowedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
public class WindowDemoSession {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> data = env.socketTextStream("hadoop01", 7777);
SingleOutputStreamOperator<String> mapped = data.map(new MapFunction<String, String>() {
@Override
public String map(String value) throws Exception {
return value;
}
});
KeyedStream<String, String> keyByed = mapped.keyBy(value -> value);
WindowedStream<String, String, TimeWindow> sesionWindow = keyByed.window(ProcessingTimeSessionWindows.withGap(Time.seconds(10)));
SingleOutputStreamOperator<String> applyed = sesionWindow.apply(new WindowFunction<String, String, String, TimeWindow>() {
@Override
public void apply(String s, TimeWindow window, Iterable<String> input, Collector<String> out) throws Exception {
StringBuilder sb = new StringBuilder();
for (String str : input) {
sb.append(str);
}
out.collect(sb.toString());
}
});
applyed.print();
env.execute();
}
}
### --- 编译打印
~~~ # 启动nc
[root@hadoop01 ~]# nc -lp 7777
~~~ 写入数据流
0号数据源
1号数据源
2号数据源
0号数据源 0号数据源 0号数据源
1号数据源 1号数据源 1号数据源
2号数据源 2号数据源 2号数据源
### --- 编译打印
D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=55348:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_pro