CC00032.flink——|Hadoop&Flink.V16|——|Flink.v16|Flink Windows窗口机制|

本文介绍了Apache Flink的时间窗口和会话窗口机制,重点讲解了会话窗口的工作原理和特点。通过一个案例展示了如何使用Flink的ProcessingTimeSessionWindows配置10秒的会话间隔,来计算用户活跃期间购买商品的数量。当用户30秒内无活动,会话窗口会关闭并开始新的计数。
摘要由CSDN通过智能技术生成
一、Flink Window窗口机制:时间窗口TimeWindow:会话窗口(Session Window)
### --- Flink Window窗口机制:时间窗口TimeWindow:会话窗口(Session Window)

~~~     时间窗口TimeWindow:会话窗口(Session Window)
### --- 会话窗口说明

~~~     由一系列事件组合一个指定时间长度的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值