RichFlatMapFunction state測試

package com.flink.example;

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]));
                    }
                }
        );
        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);
                    }

                    @Override
                    public void flatMap(Tuple2<String, Integer> in, Collector<Tuple2<String, String>> collector) throws Exception {
                        // 判斷狀態值是否爲空(狀態默認值是空)
                        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){
                            collector.collect(new Tuple2<String,String>(" 超出警戒值 > 10 ",in.f0));
                        }
                        //RichFlatMapFunction 沒有可以不輸出
                        value.name = in.f0;
                        value.value = in.f1;
                        // 更新狀態值
                        state.update(value);

                    }
                }
        );
        map.print();


        executionEnvironment.execute();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章