Flink流处理API大合集:掌握所有flink流处理技术,看这一篇就够了(1)

        // 随机数

        Random random=new Random();



        //设置10个初始温度

        HashMap<String, Double> sensorTempMap = new HashMap<>();

        for (int i = 0; i < 10; i++) {

            sensorTempMap.put("sensor_"+(i+1), 60 + random.nextGaussian() * 20); // 正态分布

        }

        while (running){

            for (String sensorId: sensorTempMap.keySet()) {

                Double newTemp = sensorTempMap.get(sensorId) + random.nextGaussian();

                sensorTempMap.put(sensorId,newTemp);

                ctv.collect(new SensorReading(sensorId,System.currentTimeMillis(),newTemp));

            }

            Thread.sleep(1000);

        }

    }



    @Override

    public void cancel() {

        running=false;

    }

}

}




[]( )三、转换算子(Transform)

------------------------------------------------------------------------------



获取到指定的数据源后,还要对数据源进行分析计算等操作,



**基本转换算子:Map、flatMap、Filter**  

![在这里插入图片描述](https://img-blog.csdnimg.cn/fd3f77dc32574c62b2a5e44636326f28.png)



public class TransformTest1_Base {

public static void main(String[] args) throws Exception {

    StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();

    env.setParallelism(1);



    //从文件读取数据

    DataStream<String> inputStream = env.readTextFile("sensor.txt");



    // 1. map 把String转换成长度生成

    DataStream<Integer> mapStream = inputStream.map(new MapFunction<String, Integer>() {

        @Override

        public Integer map(String value) throws Exception {

            return value.length();

        }

    });



//   2. flatmap 按逗号切分字段

    DataStream<String> flatMapStream = inputStream.flatMap(new FlatMapFunction<String, String>() {

        @Override

        public void flatMap(String value, Collector<String> out) throws Exception {

            String[] fields=value.split(",");

            for (String field : fields){

                out.collect(field);

            }

        }

    });



//    3. filter ,筛选sensor_1 开头对id对应的数据

    DataStream<String> filterStream=inputStream.filter(new FilterFunction<String>() {

        @Override

        public boolean filter(String value) throws Exception {

            return value.startsWith("sensor_1");

        }

    });



//    打印输出

    mapStream.print("map");

    flatMapStream.print("flatMap");

    filterStream.print("filter");



// 执行程序

    env.execute();

}

}




**KeyBy、滚动聚合算子【sum()、min()、max()、minBy()、maxBy()】**



*   KeyBy:DataStream → KeyedStream:逻辑地将一个流拆分成不相交的分区,每个分区包含具有相同 key 的元素,在内部以 hash 的形式实现的。

*   如上算子可以针对 KeyedStream 的每一个支流做聚合。



![在这里插入图片描述](https://img-blog.csdnimg.cn/b5ed00effe8f4789b167093dbd2f5a71.png)



public class TransformTest2_RollingAggregation {

public static void main(String[] args) throws Exception {

    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    env.setParallelism(1);



    //从文件读取数据

    DataStream<String> inputStream = env.readTextFile("sensor.txt");



    // 转换成SensorReading类型

    DataStream<SensorReading> dataStream=inputStream.map(new MapFunction<String, SensorReading>() {

        @Override

        public SensorReading map(String s) throws Exception {

            String[] fields=s.split(",");

            return new SensorReading(fields[0],new Long(fields[1]),new Double(fields[2]));

        }

    });



    // DataStream<SensorReading> dataStream = inputStream.map(line -> {

    //     String[] fields = line.split(",");

    //     return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));

    // });



    // 分组

    KeyedStream<SensorReading, Tuple> keyedStream = dataStream.keyBy("id");

    // KeyedStream<SensorReading, String> keyedStream1 = dataStream.keyBy(SensorReading::getId);



    //滚动聚合,取当前最大的温度值

    // DataStream<SensorReading> resultStream = keyedStream.maxBy("temperature");

    DataStream<SensorR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值