RichFlatMapFunction_State 测试


import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
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.util.Collector;

/**
   输入
   t,1
   t,12 (报警)
 a,10
 a,21 (报警)
 **/
public class RichFlatMapFunction_State {
    public static void main(String[] args) throws Exception{
        class stateFalg{
            String name;
            long value;
        }
        StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> localhost = executionEnvironment.socketTextStream("192.168.101.212", 1111);
        // 输入a,1这样的数据,计算连续两个相同key的数量差值
        // 差值不能大于10
        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<Tuple2<String, String>> map_out= map.keyBy(0).flatMap(
                // 参数1:是输入的数据类型
                //参数2:是报警时显示的数据类型
                new RichFlatMapFunction<Tuple2<String, Integer>, Tuple2<String,String>>() {
                    ValueState<stateFalg> state;
                    @Override
                    public void open(Configuration parameters) throws Exception {

                        //创建一个状态值
                        ValueStateDescriptor<stateFalg> state_desc = new ValueStateDescriptor<>("state", stateFalg.class);
                        state = getRuntimeContext().getState(state_desc);
                        System.out.println("ss"+parameters+state );
                    }

                    @Override
                    public void flatMap(Tuple2<String, Integer> in, Collector<Tuple2<String, String>> collector) throws Exception {
                         if(state.value()==null)
                             System.out.println("flatMap"+state.value());
                             else
                        System.out.println("flatMap"+state.value().value);

                        // 判断状态值是否为空(状态默认值是空)
                        if(state.value() == null){
                            stateFalg sFalg = new stateFalg();
                            sFalg.name = in.f0;
                            sFalg.value = in.f1;
                            state.update(sFalg);
                        }
                        stateFalg value = state.value();
                        if(Math.abs(value.value - in.f1)>10){
                            System.out.println(Math.abs(value.value - in.f1));
                            collector.collect(new Tuple2<String,String>(" 超出警戒值 > 10 ",in.f0));
                        }
                        //RichFlatMapFunction 没有可以不输出
                        value.name = in.f0;
                        value.value = in.f1;
                        // 更新状态值
                        state.update(value);

                    }
                }
        );
        map_out.print();


        executionEnvironment.execute("execute");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值