【尚硅谷Java版】Flink1.13 转换算子之基本转换算子

【尚硅谷Java版】Flink1.13 转换算子之基本转换算子

        数据源读入数据以后,我们就可以使用各种转换算子,将一个或多个DataStream转换为新的DataStream。一个Flink程序的核心,其实就是所有二点转换操作,他们决定了处理的业务逻辑。

一、基本转换算子

1、映射map
map是大数据操作算子,主要用于将数据流中的数据进行转换,形成新的数据流。
**简单来说,就是一一对应,消费一个元素就产出一个元素。**如下图所示:
在这里插入图片描述
我们只需要基于DataStream调用map()方法就可以进行转换处理。方法需要传入的参数是接口MapFunction的实现;返回值类型还是DataStream,不过泛型(流中的元素类型)可能改变。

具体使用:

package com.atguigu.chapter05;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import sun.security.mscapi.CPublicKey;

/**
 * @author potential
 */
public class TransformMapTest {
    public static void main(String[] args) throws Exception {
        //1、创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //并行度设置为1
        env.setParallelism(1);

        //从元素中读取数据
        DataStreamSource<Event> stream = env.fromElements(
                new Event("Mary", "./home", 1000L),
                new Event("Bob", "./cart", 2000L)
        );

        //进行转换计算,提取user字段
        /**
         * 1、使用自定义类,实现MapFunction接口
         */
        SingleOutputStreamOperator<String> map = stream.map(new MyMapper());

        //2、使用匿名类实现MapFunction接口
        SingleOutputStreamOperator<String> map1 = stream.map(new MapFunction<Event, String>() {
            @Override
            public String map(Event event) throws Exception {
                return event.user;
            }
        });

        //3、传入Lambda表达式
        SingleOutputStreamOperator<String> map2 = stream.map(data -> data.user);



       map.print();
       map1.print();
       map2.print();

        env.execute();
    }


    /**
     * 自定义类实现MapFunction接口  MapFunction<T,O>
     * MapFunction这个泛型,其中T指的是没有转换之前数据的类型 O指的是转换之后需要输出出去的数据的类型
     * 这里 我们没转换之前的数据是Event这个对象  转换之后是Event对象中的元素 于是应该是String
     */

        public static class MyMapper implements MapFunction<Event,String>{

            @Override
            public String map(Event event) throws Exception {
                return event.user;
            }
        }
}

在这里插入图片描述
2、过滤 filter
        filter作为转换操作,顾名思义是对数据流执行一个过滤,通过一个布尔条件表达式设置过滤条件,对于每一个流内元素进行判断,若为true则元素正常输出,若为false则元素被过滤掉。如下图所示:
在这里插入图片描述
        进行filter转换之后的新数据流的数据类型与元数据流是相同的,filter转换需要传入的参数需要实现FilterFunction接口而FilterFunction内要实现的filter方法,就相当于返回布尔类型的条件表达式

具体使用:

package com.atguigu.chapter05;

import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author potential
 */
public class TransformFilterTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        //从元素中读取数据
        DataStreamSource<Event> stream = env.fromElements(
                new Event("Mary", "./home", 1000L),
                new Event("Bob", "./cart", 2000L)
        );

        //1、传入一个实现了FilterFunction的类的对象
        SingleOutputStreamOperator<Event> filter = stream.filter(new MyFilter());

        //2、传入一个匿名类实现FilterFunction接口
        SingleOutputStreamOperator<Event> filter1 = stream.filter(new FilterFunction<Event>() {
            @Override
            public boolean filter(Event event) throws Exception {
                return event.user.equals("Mary");
            }
        });
        //3、传入lambda表达式
        stream.filter(data->data.user.equals("Mary")).print("Mary click");


        filter.print();
        filter1.print();
        env.execute();

    }

    //实现一个自定义的FilterFunction
    public static class MyFilter implements FilterFunction<Event>{


        @Override
        public boolean filter(Event event) throws Exception {
            return event.user.equals("Mary");
        }
    }

}

测试结果:
在这里插入图片描述
3、扁平映射 flatMap

       flatMap操作称为扁平映射,主要是将数据流中的整体(一般是集合类型)拆分成一个个的个体使用。消费一个元素可以产生0~多个元素。
       flatMap可以认为是 扁平化+映射两步操作的集合,也就是先按照某种规则对数据进行打散拆分,再对拆分后的元素转换处理。

在这里插入图片描述
具体使用:

package com.atguigu.chapter05;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * @author potential
 */
public class TransformFlatMapTest {


    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);


        //从元素中读取数据
        DataStreamSource<Event> stream = env.fromElements(
                new Event("Mary", "./home", 1000L),
                new Event("Bob", "./cart", 2000L)
        );

        //1、实现FlatMapFunction
        stream.flatMap(new MyFlatMap()).print("1");

        //2、传入一个lambda表达式
        stream.flatMap((Event event,Collector<String> out)->{
            if(event.user.equals("Mary")) {
                out.collect(event.url);
            } else if(event.user.equals("Bob")) {
                out.collect(event.user);
                out.collect(event.url);
                out.collect(event.timestamp.toString());

            }}).returns(new TypeHint<String>() {
                }).print("2");

        env.execute();

    }
        //实现一个自定义的FlatMapFunction
        public static class MyFlatMap implements FlatMapFunction<Event,String>{


            @Override
            public void flatMap(Event event, Collector<String> collector) throws Exception {

                collector.collect(event.user);
                collector.collect(event.url);
                collector.collect(event.timestamp.toString());

            }
    }
   
}

测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷大数据之Flink(Scala)文档是一份详细介绍Flink框架的文档。Flink是一种用于流处理和批处理的分布式数据处理引擎,可以实时且高效地处理大规模数据。该文档以Scala语言为基础,介绍了Flink在实时处理、窗口计算、水印机制、状态管理、故障恢复等方面的重要概念和使用方法。 文档首先介绍了Flink基本概念和架构,包括数据流和任务图的概念,以及Flink的分布式部署模式。然后,文档详细介绍了Flink的核心功能和特性,如事件时间处理、窗口计算、状态管理等。 在事件时间处理方面,文档介绍了Flink如何处理流式数据中的事件时间,并解释了水印机制的原理和使用方法。水印机制能够确保事件在流式处理中的有序性和准确性,提高了数据处理的可靠性。 窗口计算是Flink的一个重要功能,文档详细介绍了滚动窗口、滑动窗口和会话窗口等不同类型的窗口,并给出了相应的示例代码,帮助读者理解窗口计算的概念和使用方式。 此外,文档还介绍了Flink的状态管理和故障恢复机制。Flink通过内部状态存储机制来维护流处理中的状态信息,并提供了容错机制来处理节点故障和故障恢复。 最后,文档提供了大量的实例代码和案例分析,帮助读者更好地理解和应用Flink框架。读者可以通过这些示例代码来学习和实践Flink的各种功能和特性。 总之,尚硅谷大数据之Flink(Scala)文档是一份全面而详细的Flink框架学习资料,对于想要深入了解和使用Flink的开发者来说是一份非常有价值的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值