Flink 之 EventTime 划分时间窗口(会话窗口)

不分组,按照 EventTime 划分 会话 窗口
*

Non-keyed Window,底层调用的是windowAll

这个是大于最后会话数据,不是大于等于

public class EventTimeSessionWindowAllDemo {
    public static void main(String[] args) throws Exception {
      //  前关后闭   0 -- 4999  5000- 9999
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         //  两秒 调一次方法
        env.getConfig().setAutoWatermarkInterval(1000);
        // 老版本必须要设置时间标准 (1.20 之前的)
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        DataStreamSource<String> lines = env.socketTextStream("linux01", 8888);
       // flink里面的时间都精确到毫秒
       //  时间提取器 BoundedOutOfOrdernessTimestampExtractor : 允许时间乱序,并且可以指定窗口延时
       // WaterMark (水位线,可以让窗口延迟触发的一种机制)
       // 一个窗口中的一个分区的水位线 = 当前窗口当前分区最大的 EventTime - 延迟时间     Time.seconds(0)
        SingleOutputStreamOperator<String> linesWithWaterMark = lines.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<String>(Time.seconds(0)) {


            @Override
            public long extractTimestamp(String s) {
                return Long.parseLong(s.split(",")[0]); // EventTime
            }
        });
       //   提取完 EventTime 后生成 WaterMark ,但数据还是原来的老样子
       // 1000,1
        SingleOutputStreamOperator<Integer> nums = linesWithWaterMark.map(new MapFunction<String, Integer>() {

            @Override
            public Integer map(String s) throws Exception {

                return Integer.parseInt(s.split(",")[1]);
            }
        });
        //  划分窗口
        AllWindowedStream<Integer, TimeWindow> window = nums.windowAll(EventTimeSessionWindows.withGap(Time.seconds(5)));
        // 对 window 中的数据 进行聚合
        SingleOutputStreamOperator<Integer> sum = window.sum(0);

        sum.print();
        env.execute() ;


    }
}

先分组, 再按照EventTime划分 会话窗口

keyed Window,
底层调用的是window ,传入对应的 winodw Assinger

public class EventTimeSessionWindowDemo {
    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         //  两秒 调一次方法
        env.getConfig().setAutoWatermarkInterval(1000);
        // 老版本必须要设置时间标准 (1.20 之前的)
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        DataStreamSource<String> lines = env.socketTextStream("linux01", 8888);
       // flink里面的时间都精确到毫秒
       //  时间提取器 BoundedOutOfOrdernessTimestampExtractor : 允许时间乱序,并且可以指定窗口延时
       // WaterMark (水位线,可以让窗口延迟触发的一种机制)
       // 一个窗口中的一个分区的水位线 = 当前窗口当前分区最大的 EventTime - 延迟时间     Time.seconds(0)
        SingleOutputStreamOperator<String> linesWithWaterMark = lines.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<String>(Time.seconds(0)) {


            @Override
            public long extractTimestamp(String s) {
                return Long.parseLong(s.split(",")[0]); // EventTime
            }
        });
       //   提取完 EventTime 后生成 WaterMark ,但数据还是原来的老样子
       // 1000,spark,1 --> spark,1
        SingleOutputStreamOperator <Tuple2<String,Integer>> WordAndCount = linesWithWaterMark.map(new MapFunction<String, Tuple2<String,Integer>>() {

            @Override
            public Tuple2<String,Integer> map(String s) throws Exception {
                String[] split = s.split(",");
                return Tuple2.of(split[1],Integer.parseInt(split[2]));
            }
        });

        //  先 keyBy,再划分窗口
        KeyedStream<Tuple2<String, Integer>, String> keyed = WordAndCount.keyBy(t -> t.f0);

        //   划分窗口
        WindowedStream<Tuple2<String, Integer>, String, TimeWindow> window = keyed.window(EventTimeSessionWindows.withGap(Time.seconds(5)));
         //  对窗口里面的数据进行 sum
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = window.sum(1);

        sum.print();
        env.execute() ;


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值