Flink:基于事件驱动的滚动窗口使用

27 篇文章 0 订阅
<!--flink核心包-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java</artifactId>
    <version>1.7.2</version>
</dependency>
<!--flink流处理包-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.12</artifactId>
    <version>1.7.2</version>
    <scope>provided</scope>
</dependency>    

发送

netcat下载:https://blog.csdn.net/qq_38762390/article/details/115789281

nc -lk 7777
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple1;
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.windows.GlobalWindow;
import org.apache.flink.util.Collector;

public class WindowDemo {
    public static void main(String[] args) throws Exception {
        // 获取数据源
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        String hostname = "";
        int port = 7777;
        DataStreamSource<String> data = env.socketTextStream(hostname, port);

        // 创建窗口
        // 1.MapFunction第一个泛型表示输入的数据类型,第二个泛型表示输出的数据类型
        SingleOutputStreamOperator<Tuple1<String>> tupled = data.map(new MapFunction<String, Tuple1<String>>() {

            /**
             * 键输入的字符串转成一元组
             * @param s 输入的字符串
             * @return 转化后的一元组
             * @throws Exception
             */
            public Tuple1<String> map(String s) throws Exception {
                return new Tuple1<String>(s);
            }
        });

        // 2.按照一元组第一个元素分组(只有一个元素只能写0)
        KeyedStream<Tuple1<String>, Tuple> keyed = tupled.keyBy(0);

        // 3.获取事件滚动窗
        // 当数据量达到5触发生成一个窗口
        // 说明一定是相同的字符串输入了5次才会触发,因为对一元组进行了分组,则按照每组中有一个组中元素超过5即可
        WindowedStream<Tuple1<String>, Tuple, GlobalWindow> countWindow = keyed.countWindow(5L);

        // 利用时间滚动窗口对一个窗口内的数据进行处理
        // WindowFunction第一个泛型就是输入数据的数据类型;第二个泛型就是输出数据的数据类型;
        // 第三个就是key的数据类型;第四个就是窗口的数据类型
        SingleOutputStreamOperator<String> result = countWindow.apply(new WindowFunction<Tuple1<String>, String, Tuple, GlobalWindow>() {


            /**
             * 数据具体处理过程
             * @param tuple key就是分组key
             * @param globalWindow 事件窗口
             * @param iterable key组内的成员
             * @param collector 数据处理后返回的结果的对象
             * @throws Exception
             */
            public void apply(Tuple tuple, GlobalWindow globalWindow, Iterable<Tuple1<String>> iterable, Collector<String> collector) throws Exception {
                for (Tuple1<String> t : iterable) {
                    String s = t.getField(0).toString();
                    collector.collect(s);
                }
            }
        });

        result.print();
        env.execute();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员无羡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值