从0到1Flink的成长之路(十九)-案例:时间窗口

案例:时间窗口

1 需求

nc -lk 9999

有如下数据表示:信号灯编号和通过该信号灯的车的数量
a,3
a,2
a,7
d,9
b,6
a,5
b,3
e,7
e,4
需求1:基于时间的滚动窗口,窗口大小window size=滑动大小slide size

每5秒钟统计一次,最近5秒钟内,各个路口通过红绿灯汽车的数量
在这里插入图片描述

需求2:基于时间的滑动窗口,窗口大小window size>滑动大小slide size
每5秒钟统计一次,最近10秒钟内,各个路口通过红绿灯汽车的数量
在这里插入图片描述

2 代码实现:滚动时间窗口
需求1:滚动时间窗口统计,实时交通卡口车流量统计

package xx.xxxxx.flink.window.time;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
/**
* 窗口统计案例演示:滚动时间窗口(Tumbling Time Window),实时交通卡口车流量统计
*/
public class StreamTumblingTimeWindow { @Data
@AllArgsConstructor
@NoArgsConstructor
public static class CartInfo {
private String sensorId;
private Integer count;
}
public static void main(String[] args) throws Exception {
// 1. 执行环境-env:流计算执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1) ;
// 2. 数据源-source:Socket接收数据
DataStreamSource<String> inputStream = env.socketTextStream("node1.itcast.cn", 9999);
/*
数据源:信号灯编号和通过该信号灯的车的数量
a,3
a,2
a,7
d,9
b,6
a,5
b,3
e,7
e,4
*/
// 3. 转换处理-transformation:调用DataSet函数,处理数据
SingleOutputStreamOperator<CartInfo> cartInfoStream = inputStream
// a. 过滤数据
.filter(line -> null != line && line.trim().length() > 0)
// b. 解析数据,存储至JavaBean对象
.map(new MapFunction<String, CartInfo>() { @Override
public CartInfo map(String line) throws Exception {
String[] arr = line.trim().split(",");
return new CartInfo(arr[0], Integer.parseInt(arr[1]));
}
});
// TODO: 按照 信号灯编号分组,再进行窗口设置,最后对窗口中数据进行聚合统计
SingleOutputStreamOperator<CartInfo> windowDataStream = cartInfoStream
// 按照 信号灯编号分组, TODO: 当DataStream中数据类型为JavaBean时,直接指定属性名称分组(调用keyBy)
.keyBy("sensorId")
// 窗口设置: 滚动时间窗口,大小为5秒
.timeWindow(Time.seconds(5))
// 对窗口中数据进行聚合统计
.sum("count");
// 4. 数据终端-sink
windowDataStream.printToErr();
// 5. 应用执行
env.execute(StreamTumblingTimeWindow.class.getSimpleName());
} }

3 代码实现:滑动时间窗口
需求2:滑动时间窗口统计,实时交通卡口车流量统计

package xx.xxxxxx.flink.window.time;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.SlidingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
/**
* 窗口统计案例演示:滑动时间窗口(Sliding Time Window),实时交通卡口车流量统计
*/
public class StreamSlidingTimeWindow { @Data
@AllArgsConstructor
@NoArgsConstructor
public static class CartInfo {
private String sensorId;
private Integer count;
}
public static void main(String[] args) throws Exception {
// 1. 执行环境-env:流计算执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1) ;
// 2. 数据源-source:Socket接收数据
DataStreamSource<String> inputStream = env.socketTextStream("node1.itcast.cn", 9999);
/*
数据源:信号灯编号和通过该信号灯的车的数量
a,3
a,2
a,7
d,9
b,6
a,5
b,3
e,7
e,4
*/
// 3. 转换处理-transformation:调用DataSet函数,处理数据
SingleOutputStreamOperator<CartInfo> cartInfoStream = inputStream
// a. 过滤数据
.filter(line -> null != line && line.trim().length() > 0)
// b. 解析数据,存储至JavaBean对象
.map(new MapFunction<String, CartInfo>() { @Override
public CartInfo map(String line) throws Exception {
String[] arr = line.trim().split(",");
return new CartInfo(arr[0], Integer.parseInt(arr[1]));
}
});
// TODO: 按照 信号灯编号分组,再进行窗口设置,最后对窗口中数据进行聚合统计
SingleOutputStreamOperator<CartInfo> windowDataStream = cartInfoStream
// 按照 信号灯编号分组, TODO: 当DataStream中数据类型为JavaBean时,直接指定属性名称分组(调用
keyBy)
.keyBy("sensorId")
// 窗口设置: 滚动时间窗口,大小为5秒
//.timeWindow(Time.seconds(10), Time.seconds(5))
.window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
// 对窗口中数据进行聚合统计
.sum("count");
// 4. 数据终端-sink
windowDataStream.printToErr();
// 5. 应用执行
env.execute(StreamSlidingTimeWindow.class.getSimpleName());
} }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值