flink-java版学习-5-keyBy+max/min等聚合函数

 

keyBy:将Stream根据指定的Key进行分区,是根据key的散列值进行分区的(和sql的group by类似)

max:对数据聚合,取最大值,非聚合字段,返回的是第一次的值

maxBy:和max类似,但是在非聚合字段返回的是当前最大值

值得注意的是:这里的算子只能单字段聚合,另外的字段可以保留当前最大值或者首个值

package com.shihuo.apitest_transform;

import com.shihuo.com.shihuo.apitest_beans.SensrReading;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;


public class TransformTest2_RollingAggregation {
    //创建执行流处理的执行环境
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);


        // 从文件读取数据
        String inputPath = "/Users/wangyuhang/Desktop/FlinkTutorial/src/main/resources/sensor.txt";
        DataStream<String> stringDataStream = env.readTextFile(inputPath);


        //转换成sensorreading类型,主要是map操作,普通写法
        DataStream<SensrReading> dataStream = stringDataStream.map(new MapFunction<String, SensrReading>() {
            @Override
            public SensrReading map(String value) throws Exception {
                String[] fields = value.split(",");
                return new SensrReading(fields[0],new Long(fields[1]),new Double(fields[2]));
            }
        });


        //分组,这里是Tuple的原因主要是传多个字段的问题,就和sql-group by多个字段原因一样
        KeyedStream<SensrReading, Tuple> keyedStream = dataStream.keyBy("id");
        //滚动聚合
        DataStream<SensrReading> resultStream = keyedStream.max("temperature");

        resultStream.print();
        env.execute();
    }
}

结果如下:

同时:keyBy这里也可以指定位置,比如keyBy第一个字段,这和impala支持group by 1,2,3这种写法差不多

主要是这里起作用:

posted @ 2021-01-18 00:27  活不明白  阅读(103)  评论(0)    收藏  举报