import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.ProcessFunction; import org.apache.flink.util.Collector; import org.apache.flink.util.OutputTag; /** * # _*_ coding:utf-8 _*_ * # Author:xiaoshubiao * # Time : 2020/12/14 19:14 **/ public class processFunction_test { public static void main(String[] args) throws Exception{ StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> localhost = executionEnvironment.socketTextStream("localhost", 1111); // 输入a,1这样的数据,通过ProcessFunction的sideOutPut实现filter的操作 // 区分是否属于a SingleOutputStreamOperator<Tuple2<String, Integer>> map = localhost.map( new MapFunction<String, Tuple2<String, Integer>>() { @Override public Tuple2<String, Integer> map(String s) throws Exception { String[] split = s.split(","); return new Tuple2<>(split[0], Integer.valueOf(split[1])); } } ); SingleOutputStreamOperator<String> process = map.process( /* *参数一:输入数据类型。比如(a,1) * 参数二:输出数据类型。比如(属于a) * */ new ProcessFunction<Tuple2<String, Integer>, String>() { @Override public void processElement(Tuple2<String, Integer> stringIntegerTuple2, Context context, Collector<String> collector) throws Exception { if (stringIntegerTuple2.f0.equals("a")) { // 直接返回 collector.collect("属于a"); } else { // 通过上下文输出,定义输出标签和值 context.output(new OutputTag<String>("is_not_a"){}, "不属于a"); } } } ); process.print("is_a"); process.getSideOutput(new OutputTag<String>("is_not_a"){}).print("is_not_a"); executionEnvironment.execute(); } } /* * 输入 输出 * a,1 属于a * b,1 不属于a * c,1 不属于a * * * */