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



    org.apache.flink
    flink-java
    1.7.2



    org.apache.flink
    flink-streaming-java_2.12
    1.7.2
    provided
    

发送

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 data = env.socketTextStream(hostname, port);

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

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

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

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

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


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

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

 

你可能感兴趣的:(Java,Flink,flink,java,maven)