分流
分流:将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个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"); } }
立志如山 静心求实
浙公网安备 33010602011771号