• 练习 : Flink TimeWindow 滑动 滚动 窗口 增量 全量 统计


     1 import org.apache.commons.collections.IteratorUtils;
     2 import org.apache.flink.api.common.functions.AggregateFunction;
     3 import org.apache.flink.api.common.functions.MapFunction;
     4 import org.apache.flink.api.java.functions.KeySelector;
     5 import org.apache.flink.api.java.tuple.Tuple;
     6 import org.apache.flink.api.java.tuple.Tuple2;
     7 import org.apache.flink.api.java.tuple.Tuple4;
     8 import org.apache.flink.streaming.api.TimeCharacteristic;
     9 import org.apache.flink.streaming.api.datastream.DataStreamSource;
    10 import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
    11 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    12 import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
    13 import org.apache.flink.streaming.api.windowing.time.Time;
    14 import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
    15 import org.apache.flink.util.Collector;
    16 
    17 
    18 public class TimeWindow1 {
    19     public static void main(String[] args) throws Exception {
    20         //Flink环境
    21         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    22         //设置并行度
    23         env.setParallelism(1);
    24         //时间语义:处理时间
    25         env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
    26         //加载套接字数据源
    27         DataStreamSource<String> source = env.socketTextStream("hadoop106", 9999);
    28         //将数据流切割,封装成传感器对象
    29         SingleOutputStreamOperator<Sensor> map = source.map(new MapFunction<String, Sensor>() {
    30             @Override
    31             public Sensor map(String s) throws Exception {
    32                 String[] split = s.split(",");
    33                 return new Sensor(split[0], Long.valueOf(split[1]), Double.valueOf(split[2]));
    34             }
    35         });
    36 
    37         //10s内最低温度
    38         map.keyBy(new KeySelector<Sensor, String>() {
    39             @Override
    40             public String getKey(Sensor sensor) throws Exception {
    41                 return sensor.getSensor_id();
    42             }
    43         }).timeWindow(Time.seconds(10)).minBy("sensor_Temp").print();
    44 
    45         //增量统计 10s内 传感器消息次数
    46         map.keyBy("sensor_id").timeWindow(Time.seconds(10)).aggregate(new AggregateFunction<Sensor, Tuple2<Sensor,Integer>, String>() {
    47             @Override
    48             public Tuple2<Sensor, Integer> createAccumulator() {
    49                 return new Tuple2<>(new Sensor(),0);
    50             }
    51             @Override
    52             public Tuple2<Sensor, Integer> add(Sensor sensor, Tuple2<Sensor, Integer> t) {
    53                 return new Tuple2<>(sensor,t.f1+1);
    54             }
    55             @Override
    56             public String getResult(Tuple2<Sensor, Integer> t) {
    57                 return t.f0.getSensor_id()+":"+t.f1;
    58             }
    59             @Override
    60             public Tuple2<Sensor, Integer> merge(Tuple2<Sensor, Integer> acc, Tuple2<Sensor, Integer> acc1) {
    61                 return new Tuple2<>(acc.f0,acc1.f1+acc.f1);
    62             }
    63         }).print();
    64 
    65         //全量统计 各个温度计 开始 结束 时间 总温度
    66         map.keyBy("sensor_id").timeWindow(Time.seconds(10)).apply(new WindowFunction<Sensor, Tuple4<String,Long,Long,Integer>, Tuple, TimeWindow>() {
    67             @Override
    68             public void apply(Tuple tuple, TimeWindow window, Iterable<Sensor> iterable, Collector<Tuple4<String, Long, Long, Integer>> collector) throws Exception {
    69                 String field = tuple.getField(0);
    70                 long start = window.getStart();
    71                 long end = window.getEnd();
    72                 int total = IteratorUtils.toList(iterable.iterator()).size();
    73                 collector.collect(new Tuple4<>(field,start,end,total));
    74             }
    75         }).print();
    76 
    77         env.execute();
    78     }
    79 }
     1 import org.apache.flink.api.common.functions.AggregateFunction;
     2 import org.apache.flink.api.common.functions.MapFunction;
     3 import org.apache.flink.api.java.tuple.Tuple2;
     4 import org.apache.flink.api.java.tuple.Tuple3;
     5 import org.apache.flink.streaming.api.TimeCharacteristic;
     6 import org.apache.flink.streaming.api.datastream.DataStreamSource;
     7 import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
     8 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
     9 import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
    10 import org.apache.flink.streaming.api.windowing.time.Time;
    11 
    12 public class TimeWindow2 {
    13     public static void main(String[] args) throws Exception {
    14         //环境
    15         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    16         env.setParallelism(1);
    17         env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
    18         //数据源
    19         DataStreamSource<String> hadoop106 = env.socketTextStream("hadoop106", 9999);
    20         SingleOutputStreamOperator<Sensor> map = hadoop106.map(new MapFunction<String, Sensor>() {
    21             @Override
    22             public Sensor map(String s) throws Exception {
    23                 String[] split = s.split(",");
    24                 return new Sensor(split[0], Long.valueOf(split[1]), Double.valueOf(split[2]));
    25             }
    26         });
    27         //水位线 3s
    28         SingleOutputStreamOperator<Sensor> ope = map.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Sensor>(Time.seconds(3)) {
    29             @Override
    30             public long extractTimestamp(Sensor sensor) {
    31                 return sensor.getSensor_timeStamp();
    32             }
    33         });
    34         //使用滑动窗口,10s步长,5s滑动一次,每10秒的统计温度最大值
    35         ope.keyBy("sensor_id").timeWindow(Time.seconds(10),Time.seconds(5)).max("sensor_Temp").print();
    36 
    37         //使用滑动窗口,10s步长,5s滑动一次,增量统计平均温度
    38         SingleOutputStreamOperator<Tuple2<String, Double>> avg = map.keyBy("sensor_id").timeWindow(Time.seconds(10)).aggregate(new AggregateFunction<Sensor, Tuple3<Sensor, Integer, Double>, Tuple2<String, Double>>() {
    39             @Override
    40             public Tuple3<Sensor, Integer, Double> createAccumulator() {
    41                 return new Tuple3<>(new Sensor(), 0, 0.0);
    42             }
    43             @Override
    44             public Tuple3<Sensor, Integer, Double> add(Sensor sensor, Tuple3<Sensor, Integer, Double> t) {
    45                 return new Tuple3<>(sensor, t.f1 + 1, t.f2+sensor.getSensor_Temp());
    46             }
    47             @Override
    48             public Tuple2<String, Double> getResult(Tuple3<Sensor, Integer, Double> t) {
    49                 return new Tuple2<>( t.f0.getSensor_id(), t.f2*1.0 / t.f1);
    50             }
    51             @Override
    52             public Tuple3<Sensor, Integer, Double> merge(Tuple3<Sensor, Integer, Double> acc, Tuple3<Sensor, Integer, Double> acc1) {
    53                 return new Tuple3<>(acc.f0, acc.f1 + acc1.f1, acc.f2 + acc1.f2);
    54             }
    55         });
    56         avg.print();
    57         env.execute();
    58 
    59     }
    60 }
  • 相关阅读:
    几道算法题及学java心得
    css入门
    关于 移动端整屏切换专题 效果的思考
    css3实现卡牌旋转与物体发光效果
    九方格抽奖插件
    绑定弹窗事件最好的方法,原生JS和JQuery方法
    整屏滚动效果 jquery.fullPage.js插件+CSS3实现
    自定义 页面滚动条
    有趣的HTML5 CSS3效果
    CSS3 过渡与动画
  • 原文地址:https://www.cnblogs.com/chang09/p/15966335.html
Copyright © 2020-2023  润新知