Flink状态之KeyedListState
1、主类
package com.example.demo.flink; import com.example.demo.flink.impl.CountAverageWithListState; import com.example.demo.flink.impl.CountAverageWithValueState; 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 TestKeyedListStateMain { 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 CountAverageWithListState()) .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.ListState; import org.apache.flink.api.common.state.ListStateDescriptor; 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.shaded.guava18.com.google.common.collect.Lists; import org.apache.flink.util.Collector; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * ValueState<T> :这个状态为每一个 key 保存一个值 * value() 获取状态值 * update() 更新状态值 * clear() 清除状态 * * IN,输入的数据类型 * OUT:数据出的数据类型 */ public class CountAverageWithListState extends RichFlatMapFunction<Tuple2<Long, Long>, Tuple2<Long, Double>> { private ListState<Tuple2<Long,Long>> listState; /***状态初始化*/ @Override public void open(Configuration parameters) throws Exception { ListStateDescriptor descriptor = new ListStateDescriptor<Tuple2<Long,Long>>("listDescriptor",Types.TUPLE(Types.LONG,Types.LONG)); listState = getRuntimeContext().getListState(descriptor); } @Override public void flatMap(Tuple2<Long, Long> element, Collector<Tuple2<Long, Double>> collector) throws Exception { //拿取状态 Iterable<Tuple2<Long, Long>> listValue = listState.get(); //如果是空,则初始化 if(listValue == null){ listState.addAll(Collections.emptyList()); }else { //不为空,添加 listState.add(element); } List<Tuple2<Long, Long>> allEles = Lists.newArrayList(listState.get()); if(allEles.size() >=3){ long count = 0; long sum = 0; for (Tuple2<Long, Long> ele:allEles) { count++; sum += ele.f1; } double avg = (double) sum / count; collector.collect(Tuple2.of(element.f0,avg)); listState.clear(); } } }
本文来自博客园,作者:小白啊小白,Fighting,转载请注明原文链接:https://www.cnblogs.com/ywjfx/p/14228557.html