Flink状态之KeyedVauleState

1、主类

package com.example.demo.flink;

import com.example.demo.flink.impl.CountAverageWithValueState;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
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.environment.StreamExecutionEnvironment;


/**
 * @program: demo
 * @description: valuestate
 * @author: yang
 * @create: 2020-12-28 15:46
 */
public class TestKeyedValueStateMain {
    public static void main(String[] args) throws  Exception{
        //获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
        //StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度
        env.setParallelism(16);
        //获取数据源
        DataStreamSource<Tuple2<Long, Long>> dataStreamSource =
                env.fromElements(
                        Tuple2.of(1L, 3L),
                        Tuple2.of(1L, 7L),
                        Tuple2.of(2L, 4L),
                        Tuple2.of(1L, 5L),
                        Tuple2.of(2L, 2L),
                        Tuple2.of(2L, 6L));
        // 输出:
        //(1,5.0)
        //(2,4.0)
        dataStreamSource
                .keyBy(0)
                .flatMap(new CountAverageWithValueState())
                .print();


        env.execute("TestStatefulApi");
    }

}

2、处理实现类

package com.example.demo.flink.impl;

/**
 * @program: demo
 * @description: valuestate
 * @author: yang
 * @create: 2020-12-28 16:26
 */
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.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;

/**
 *  ValueState<T> :这个状态为每一个 key 保存一个值
 *      value() 获取状态值
 *      update() 更新状态值
 *      clear() 清除状态
 *
 *      IN,输入的数据类型
 *      OUT:数据出的数据类型
 */
public class CountAverageWithValueState
        extends RichFlatMapFunction<Tuple2<Long, Long>, Tuple2<Long, Double>> {

    private ValueState<Tuple2<Long,Long>> countAndSum;

    /**注册状态,并初始化*/
    @Override
    public void open(Configuration parameters) throws Exception {
        ValueStateDescriptor descriptor = new ValueStateDescriptor<Tuple2<Long, Long>>("valueDescriptor",Types.TUPLE(Types.LONG,Types.LONG));
        countAndSum = getRuntimeContext().getState(descriptor);

    }

    @Override
    public void flatMap(Tuple2<Long, Long> element, Collector<Tuple2<Long, Double>> collector) throws Exception {
        //拿取当前key的状态值
        Tuple2<Long, Long> currentState = countAndSum.value();
        //如果是空,则初始化
        if(currentState == null){
            currentState = Tuple2.of(0L,0L);
        }
        //不为空,则计算,f0为key出现的次数 , f1为key对应的value叠加值
        currentState.f0 +=1;
        currentState.f1 += element.f1;

        countAndSum.update(currentState);

        if(currentState.f0 >=3){
            double avg = (double)currentState.f1 / currentState.f0;
            collector.collect(Tuple2.of(element.f0,avg));
            countAndSum.clear();
        }
    }
}

 

posted @ 2021-01-04 10:38  小白啊小白,Fighting  阅读(322)  评论(0编辑  收藏  举报