Flink 连续窗口的实践

528 阅读1分钟

连续窗口

连续窗口就是多个窗口相连,后面窗口的范围与前面窗口的范围是相互独立的

  • 示例 windowAll窗口对前面的窗口产生的数据进行排序

public static void main(String[] args) {
    StreamExecutionEnvironment executionEnvironment =
            StreamExecutionEnvironment.getExecutionEnvironment();
    executionEnvironment.setParallelism(1);
    DataStreamSource<String> dataStreamSource = executionEnvironment.socketTextStream(
            "localhost", 9097);
    dataStreamSource.map(x -> {
        String[] split = x.split(",");
        City city = new City();
        city.setName(split[0]);
        city.setNum(Long.valueOf(split[1]));
        return city;
    }).keyBy(x -> x.getName()).window(TumblingProcessingTimeWindows.of(Time.seconds(10))).reduce(new ReduceFunction<City>() {
        @Override
        public City reduce(City value1, City value2) throws Exception {
            value1.setNum(value1.getNum() + value2.getNum());
            return value1;
        }
    }).windowAll(TumblingProcessingTimeWindows.of(Time.seconds(10))).apply(new AllWindowFunction<City, City, TimeWindow>() {

        @Override
        public void apply(TimeWindow window, Iterable<City> values, Collector<City> out) throws Exception {
            ArrayList<City> list = new ArrayList<>();
            values.forEach(list::add);
            list.sort(Comparator.comparing(City::getNum).reversed());
            list.stream().forEach(out::collect);
        }
    }).print();

    try {
        executionEnvironment.execute("test two windows");
    } catch (Exception e) {
        e.printStackTrace();
    }
}