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();
    }
}
相关推荐
城数派4 分钟前
1991-2100年中国1km分辨率逐月气候指标栅格数据集(28个气象指标)
大数据
AC赳赳老秦20 分钟前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
知识分享小能手1 小时前
统计学学习教程,从入门到精通,参数估计 — 知识点详解与公式推导(10)
学习·机器学习·概率论
有Li1 小时前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
yurenshi16682 小时前
自媒体多账号管理工具 4 款实测:聚媒通 / 融媒宝 / 新榜小豆芽 / 矩阵通横向对比,快速选型
大数据·矩阵·媒体
nVisual3 小时前
机柜PDU安装位置与空间建模方案
大数据·网络·数据库·信息可视化·数据中心基础设施管理
@insist1233 小时前
系统规划与管理师-流程评价与持续改进核心知识-终章
大数据·人工智能·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
sulikey4 小时前
个人Linux操作系统学习笔记11 - 环境变量
linux·笔记·学习
TechEdu2026064 小时前
[计算机科学]大数据硬件架构与软件架构概览
大数据·计算机科学
爱莉希雅&&&4 小时前
elasticsearch+kibana+logstash+filebeat链路部署流程
大数据·elasticsearch·搜索引擎·kibana·logstash·filebeat