一、不分组SlidingWindow
DataStream<String> lines = env.socketTextStream("192.168.87.130", 8888);
SingleOutputStreamOperator<Integer> word = lines.flatMap(new FlatMapFunction<String, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public void flatMap(String value, Collector<Integer> out)
throws Exception {
out.collect(Integer.parseInt(value));
}
});
//不分组,整体当成一个组
AllWindowedStream<Integer, TimeWindow> windowStream = word.timeWindowAll(Time.seconds(10), Time.seconds(5));
SingleOutputStreamOperator<Integer> summed = windowStream.sum(0);
summed.print();
输入:1,2,3
输出
2>3
3>6
4>3

二、SlidingWindow(先分组,再滑动)
DataStream<String> lines = env.socketTextStream("192.168.87.130", 8888);
SingleOutputStreamOperator<Tuple2<String, Integer>> word = lines.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
private static final long serialVersionUID = 7179469626039725354L;
@Override
public void flatMap(String value,
Collector<Tuple2<String, Integer>> out) throws Exception {
String[] splitStr = value.split(",");
out.collect(Tuple2.of(splitStr[0], Integer.parseInt(splitStr[1])));
}
});
//先分组,再划分窗口
KeyedStream<Tuple2<String, Integer>, Tuple> keyed = word.keyBy(0);
WindowedStream<Tuple2<String, Integer>, Tuple, TimeWindow> windowStream = keyed.timeWindow(Time.seconds(10), Time.seconds(5));
SingleOutputStreamOperator<Tuple2<String,Integer>> summed = windowStream.sum(1);
summed.print();
三、SessionWindow基本使用
DataStream<String> lines = env.socketTextStream("192.168.87.130", 8888);
SingleOutputStreamOperator<Integer> word = lines.flatMap(new FlatMapFunction<String, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public void flatMap(String value, Collector<Integer> out)
throws Exception {
out.collect(Integer.parseInt(value));
}
});
//不分组,整体当成一个组
AllWindowedStream<Integer, TimeWindow> windowStream = word.windowAll(ProcessingTimeSessionWindows.withGap(Time.seconds(5)));
SingleOutputStreamOperator<Integer> summed = windowStream.sum(0);
summed.print();
设置5s没输入后划分一个窗口
四、EventTime和SessionWindow
//设置EventTime作为时间标准 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); //timestamp,flink,2 //timestamp,sprak,3 DataStream<String> lines = env.socketTextStream("192.168.87.130", 8888) .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<String>(Time.seconds(0)) { private static final long serialVersionUID = -4441231666252017557L; //将数据中的时间字段提取出来,然后转成long类型 @Override public long extractTimestamp(String element) { String[] time = element.split(","); return Long.parseLong(time[0]); } }); SingleOutputStreamOperator<Tuple2<String, Integer>> word = lines.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() { private static final long serialVersionUID = 7179469626039725354L; @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception { String[] splitStr = value.split(","); out.collect(Tuple2.of(splitStr[1], Integer.parseInt(splitStr[2]))); } }); //先分组,再划分窗口 KeyedStream<Tuple2<String, Integer>, Tuple> keyed = word.keyBy(0); WindowedStream<Tuple2<String, Integer>, Tuple, TimeWindow> windowStream = keyed.window(EventTimeSessionWindows.withGap(Time.seconds(5))); SingleOutputStreamOperator<Tuple2<String,Integer>> summed = windowStream.sum(1); summed.print();
输入:
1000,flink,2 2000,flink,1 6100,flink,3 7000,flink,4 99999999,flink,5
输出:
4> (flink,10)
第一列的时间间隔超过5s后划分一个窗口