42、Flink 的默认窗口触发器 GlobalWindows 代码示例

1、PurgingTrigger

接收另一个 trigger 并将它转换成一个会清理数据的 trigger。

2、NeverTrigger

GlobalWindows 默认使用,任何时候都不触发窗口计算。

3、DeltaTrigger

根据接入数据计算出来的 Delta 指标是否超过指定的 Threshold 去判断是否触发窗口计算。

4、CountTrigger

在窗口中的元素超过预设的限制时触发。

5、完整代码示例

import org.apache.flink.api.common.typeutils.base.StringSerializer;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.functions.windowing.delta.DeltaFunction;
import org.apache.flink.streaming.api.windowing.assigners.GlobalWindows;
import org.apache.flink.streaming.api.windowing.triggers.CountTrigger;
import org.apache.flink.streaming.api.windowing.triggers.DeltaTrigger;
import org.apache.flink.streaming.api.windowing.triggers.PurgingTrigger;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;
import org.apache.flink.util.Collector;

public class _11_WindowTriggerDefaultGlobalWindows {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<String> input = env.socketTextStream("localhost", 8888);

        // 测试时限制了分区数,生产中需要设置空闲数据源
        env.setParallelism(2);

        // 全局窗口
        // 1、PurgingTrigger(接收另一个 trigger 并将它转换成一个会清理数据的 trigger)
        // 将 Fire 转为 FIRE_AND_PURGE

        // 2、NeverTrigger(GlobalWindows 默认使用,任何时候都不触发窗口计算)

        // 3、DeltaTrigger(根据接入数据计算出来的 Delta 指标是否超过指定的 Threshold 去判断是否触发窗口计算)
        // getDelta(String first, String now) 方法参数
        // a1\b1
        // a2\b2
        //
        // first=>b1,now=>a2
        // first=>a1,now=>b2
        //
        // a3
        //
        // first=>a1,now=>a3
        //
        // 2> a1
        // 2> b2
        // 2> a3
        //
        // b3
        //
        // first=>b1,now=>b3
        //
        // 1> b1
        // 1> a2
        // 1> b3

        // 4、CountTrigger(在窗口中的元素超过预设的限制时触发)
        // a\b\c
        //
        // a\b\c
        //
        // a
        //
        // 2> a
        // 2> a
        // 2> a
        //
        // b
        //
        // 1> b
        // 1> b
        // 1> b
        //
        // c
        //
        // 1> c
        // 1> c
        // 1> c
        input.keyBy(e -> String.valueOf(e.hashCode() % 2))
                .window(GlobalWindows.create())
                .trigger(PurgingTrigger.of(CountTrigger.of(3)))
//                .trigger(DeltaTrigger.of(1.0, new DeltaFunction<String>() {
//                    @Override
//                    public double getDelta(String first, String now) {
//                        System.out.println("first=>" + first + ",now=>" + now);
//                        double res = 0.0;
//                        if (first.endsWith("1") && now.endsWith("3")) {
//                            res = 2.0;
//                        }
//                        return res;
//                    }
//                }, new StringSerializer()))
//                .trigger(new GlobalWindows.NeverTrigger())
//                .trigger(CountTrigger.of(2))
                .apply(new WindowFunction<String, String, String, GlobalWindow>() {
                    @Override
                    public void apply(String s, GlobalWindow globalWindow, Iterable<String> iterable, Collector<String> collector) throws Exception {
                        for (String word : iterable) {
                            collector.collect(word);
                        }
                    }
                })
                .print();

        env.execute();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫猫爱吃小鱼粮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值