import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.BroadcastState;
import org.apache.flink.api.common.state.MapStateDescriptor;
import org.apache.flink.api.common.state.ReadOnlyBroadcastState;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.BroadcastStream;
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.co.BroadcastProcessFunction;
import org.apache.flink.util.Collector;
public class BroadcastStateDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(10000);
DataStreamSource<String> lines = env.socketTextStream("linux01", 8888);
SingleOutputStreamOperator<Tuple3<String, String, String>> maplines = lines.map(new MapFunction<String, Tuple3<String, String, String>>() {
@Override
public Tuple3<String, String, String> map(String line) throws Exception {
String[] fields = line.split(",");
return Tuple3.of(fields[0], fields[1], fields[2]);
}
});
MapStateDescriptor<String, String> Descriptor = new MapStateDescriptor<>("weiduliu", String.class, String.class);
BroadcastStream<Tuple3<String, String, String>> broadcaststream = maplines.broadcast(Descriptor);
DataStreamSource<String> lines2 = env.socketTextStream("linux01", 9999);
SingleOutputStreamOperator<Tuple2<String, Double>> maplines2 = lines2.map(new MapFunction<String, Tuple2<String, Double>>() {
@Override
public Tuple2<String, Double> map(String line) throws Exception {
String[] fields = line.split(",");
return Tuple2.of(fields[0], Double.parseDouble(fields[1]));
}
});
SingleOutputStreamOperator<Tuple3<String, String, Double>> res = maplines2.connect(broadcaststream).process(new BroadcastProcessFunction<Tuple2<String, Double>, Tuple3<String, String, String>, Tuple3<String, String, Double>>() {
@Override
public void processElement(Tuple2<String, Double> value, ReadOnlyContext ctx, Collector<Tuple3<String, String, Double>> out) throws Exception {
String id = value.f0;
Double money = value.f1;
ReadOnlyBroadcastState<String, String> brostate = ctx.getBroadcastState(Descriptor);
String name = brostate.get(id);
if (name == null) {
name = "未知";
}
out.collect(Tuple3.of(id, name, money));
}
@Override
public void processBroadcastElement(Tuple3<String, String, String> value, Context ctx, Collector<Tuple3<String, String, Double>> out) throws Exception {
String id = value.f0;
String name = value.f1;
String type = value.f2;
BroadcastState<String, String> brostate = ctx.getBroadcastState(Descriptor);
if (type.equals("delete")) {
brostate.remove(id);
} else {
brostate.put(id, name);
}
}
});
res.print();
env.execute("BroadcastStateDemo");
}}
