0

Flink是下一代大数据计算平台,可处理流计算和批量计算。《Flink-1.9流计算开发:六、reduce函数》是cosmozhu写的本系列文章的第六篇。通过简单的DEMO来演示reduce函数执行的效果 。

需求

利用reduce函数来实时统计每种商品的商品数量

解决方案

public class StreamTest {
    private static final Logger LOG = LoggerFactory.getLogger(StreamTest.class);
    private static final String[] TYPE = { "苹果", "梨", "西瓜", "葡萄", "火龙果" };

    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //添加自定义数据源,每秒发出一笔订单信息{商品名称,商品数量}
        DataStreamSource<Tuple2<String, Integer>> orderSource = env.addSource(new SourceFunction<Tuple2<String, Integer>>() {
            private volatile boolean isRunning = true;
            private final Random random = new Random();
            @Override
            public void run(SourceContext<Tuple2<String, Integer>> ctx) throws Exception {
                while (isRunning) {
                    TimeUnit.SECONDS.sleep(1);
                    ctx.collect(Tuple2.of(TYPE[random.nextInt(TYPE.length)], 1));
                }
            }
            @Override
            public void cancel() {
                isRunning = false;
            }

        }, "order-info");

        orderSource.keyBy(0)
        //将上一元素与当前元素相加后,返回给下一元素处理
        .reduce(new ReduceFunction<Tuple2<String,Integer>>() {
            @Override
            public Tuple2<String, Integer> reduce(Tuple2<String, Integer> value1, Tuple2<String, Integer> value2)
                    throws Exception {
                return Tuple2.of(value1.f0, value1.f1+value2.f1);
            }
        })
        .print();

        env.execute("Flink Streaming Java API Skeleton");
    }
}

执行效果

3> (西瓜,1)
3> (梨,1)
3> (苹果,1)
2> (火龙果,1)
3> (梨,2)
3> (梨,3)
3> (苹果,2)
3> (梨,4)
1> (葡萄,1)

小结

这里利用reduce函数实现了与sum函数相同的效果。熟悉map-reduce的同学可能更容易理解这个函数。这个例子中,reduce函数的功能就是将数据流中的上一个数据和当前数据相加,然后返回传递给下次调用。

reduce-样例代码作用示意图

代码地址

https://github.com/chaoxxx/learn-flink-stream-api/blob/master/src/main/java/fun/cosmozhu/session6/StreamTest.java

作者:cosmozhu --90后的老父亲,专注于保护地球的程序员
个人网站:http://www.cosmozhu.fun
欢迎转载,转载时请注明出处。