博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

练习 : 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 }

 

posted @ 2022-03-04 22:04  CHANG_09  阅读(388)  评论(0)    收藏  举报