事实流和维度流广播案例

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;


/*
*    //维度的数据流
        //1,图书,INSERT
        //2,手机,INSERT
        //3,家具,INSERT
        //1,少儿读物,UPDATE
        //1,少儿读物,DELETE*/

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);
/*  //订单数据库(事实)
        //1,50
        //2,2000
        */
        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);
               // System.out.println("subtasks:" + getRuntimeContext().getIndexOfThisSubtask() + "," + value + brostate);
                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);
                }
               // System.out.println("subtasks:" + getRuntimeContext().getIndexOfThisSubtask() + "," + value + brostate);


            }


        });
        res.print();
        env.execute("BroadcastStateDemo");
    }}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值