Flink学习之旅:(四)Flink转换算子(Transformation)

1.基本转换算子

|---------------|---------------------------------------|
| 基本转换算子 | 说明 |
| 映射(map) | 将数据流中的数据进行转换,形成新的数据流 |
| 过滤(filter) | 将数据流中的数据根据条件过滤 |
| 扁平映射(flatMap) | 将数据流中的整体(如:集合)拆分成个体使用。消费一个元素,产生0到多个元素 |

复制代码
package com.qiyu.Transformation;

import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * @author MR.Liu
 * @version 1.0
 * @data 2023-10-19 11:00
 */
public class Trans {

    /***
     *  映射 map 算子
     * @param env
     */
    public static void map(StreamExecutionEnvironment env){
        DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5);

        //将集合中的元素值都 加上 100
        DataStream<Integer> map = stream.map(new MapFunction<Integer, Integer>() {
            @Override
            public Integer map(Integer integer) throws Exception {
                return integer+100;
            }
        });
        map.print();
    }

    /***
     * 过滤 filter 算子
     * @param env
     */
    public static void filter(StreamExecutionEnvironment env){
        DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5);
        //将集合中的值取模,不等于1的通行,反之过滤
        DataStream<Integer> filter = stream.filter(new FilterFunction<Integer>() {
            @Override
            public boolean filter(Integer integer) throws Exception {
                if (integer % 2 != 1) {
                    return true;
                }
                return false;
            }
        });
        filter.print();
    }

    /***
     * 扁平化 flatMap 算子
     * @param env
     */
    public static void flatMap(StreamExecutionEnvironment env){
        DataStream<String> stream = env.fromElements(
                "Flink is a powerful framework for stream and batch processing",
                "It provides support for event time processing"
        );
        //将字符串以空格分隔,拆成多个字符串个体
        stream.flatMap(new FlatMapFunction<String, Object>() {
            @Override
            public void flatMap(String s, Collector<Object> collector) throws Exception {
                String[] words = s.split(" ");
                for (String word : words){
                    collector.collect(word);
                }
            }
        }).print();


    }

    /**
     * 主程序类
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        //map(env);
        //filter(env);
        flatMap(env);
        env.execute();
    }
}

2.聚合算子

|--------------|-------------------------------------------------------------------------------------------------------------------------------|
| 聚合算子 | 说明 |
| 按键分区(keyBy) | 通过指定键(key),将一条流逻辑上划分为不同的分区。分区指的是并行任务的子任务,对应着任务槽(task solt) |
| 简单聚合 | sum():在输入流上,对指定的字段做叠加求和的操作。 min():在输入流上,对指定的字段求最小值。 max():在输入流上,对指定的字段求最大值。 minBy():在输入流上针对指定字段求最小值。 maxBy():在输入流上针对指定字段求最大值。 |
| 归约聚合(reduce) | 可以把每一个新输入的数据和当前已经归约出来的值,做聚合计算 |

复制代码
package com.qiyu.Transformation;

import com.qiyu.Source.Student;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.ArrayList;

/**
 * @author MR.Liu
 * @version 1.0
 * @data 2023-10-19 14:45
 */
public class Aggregation {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStreamSource<Tuple2<String, Integer>> stream = env.fromElements(
                Tuple2.of("a", 1),
                Tuple2.of("a", 3),
                Tuple2.of("b", 3),
                Tuple2.of("b", 4)
        );
        
        stream.keyBy(r -> r.f0).print();
        stream.keyBy(r -> r.f0).sum(1).print();
        stream.keyBy(r -> r.f0).min(1).print();
        stream.keyBy(r -> r.f0).max(1).print();
        stream.keyBy(r -> r.f0).maxBy(1).print();
        stream.keyBy(r -> r.f0).minBy(1).print();

        stream.keyBy(r -> r.f0).reduce(new ReduceFunction<Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> reduce(Tuple2<String, Integer> t1, Tuple2<String, Integer> t2) throws Exception {
                return Tuple2.of(t1.f0, t1.f1 + t2.f1);
            }
        }).print();

        env.execute();
    }
}
相关推荐
新芒3 分钟前
暖通行业两位数下滑,未来靠什么赢?
大数据·人工智能
1024小神22 分钟前
SVG标签中path路径参数学习
学习
忆~遂愿29 分钟前
CANN ATVOSS 算子库深度解析:基于 Ascend C 模板的 Vector 算子子程序化建模与融合优化机制
大数据·人工智能
浅念-37 分钟前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
ZH154558913138 分钟前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
简佐义的博客1 小时前
生信入门进阶指南:学习顶级实验室多组学整合方案,构建肾脏细胞空间分子图谱
人工智能·学习
近津薪荼1 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
艾莉丝努力练剑2 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
张人玉2 小时前
VisionPro 定位与卡尺测量学习笔记
笔记·学习·计算机视觉·vsionprp