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这种写法差不多
主要是这里起作用:

浙公网安备 33010602011771号