分流

       分流:将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个DataStream,得到完全平等的多个子 DataStream

  处理函数本身可以认为是一个转换算子,它的输出类型是单一的,处理之后得到的仍然是一个 DataStream;而侧输出流则不受限制,可以任意自定义输出数据,它们就像从“主流”上分叉出的“支流”。只需要调用上下文 ctx 的.output()方法,就可以输出任意类型的数据了。而侧输出流的标记和提取,都离不开一个“输出标签”(OutputTag)。

public class SplitStreamOutTest {

    public static void main(String[] args) throws Exception {
        /**
         * 定义输出标签,输出数据类型为三元组(user,url,timestamp)
         */
        OutputTag<Tuple3<String, String, Long>> maryTag = new OutputTag<Tuple3<String, String, Long>>("mary") {
        };
        OutputTag<Tuple3<String, String, Long>> sliceTag = new OutputTag<Tuple3<String, String, Long>>("slice") {
        };

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        SingleOutputStreamOperator<Event> process = env.addSource(new MySource())
                .process(new ProcessFunction<Event, Event>() {
                    @Override
                    public void processElement(Event event, Context ctx, Collector<Event> out) throws Exception {
                        if (event.getUser().equalsIgnoreCase("mary")) {
                            ctx.output(maryTag, new Tuple3<>(event.getUser(), event.getUrl(), event.getTimeMillis()));
                        } else if (event.getUser().equalsIgnoreCase("slice")) {
                            ctx.output(sliceTag, new Tuple3<>(event.getUser(), event.getUrl(), event.getTimeMillis()));
                        } else {
                            out.collect(event);
                        }
                    }
                });

        process.getSideOutput(maryTag).print();
        process.getSideOutput(sliceTag).print();
        process.print();

        env.execute("split");
    }
}

 

posted on 2022-11-25 22:02  溪水静幽  阅读(463)  评论(0)    收藏  举报