flink无状态转换算子map() flatMap()

Apache Flink常见的一些场景为数据的ETL(抽取、转换、加载)管道任务。
从一个或多个数据源获取数据,进行一些转换操作和信息补充,将结果存储起来。

无状态转换

无状态的转换:包括map()和flatmap()

  • map()

调用用户定义的MapFunction对DataStream[T]数据进行处理,形成新的Data-Stream[T],其中数据格式可能会发生变化,常用作对数据集内数据的清洗和转换。例如将输入数据集中的每个数值全部加1处理,并且将数据输出到下游数据集。
map()基本是一对一服务,即输入一个元素输出一个元素。

例如:
scala版本

val dataStream = env.fromElements(("a",1),("b",2),("a",3))
val mapStream: DataStream[(String, Int)] = dataStream.map(t => (t_1, t_2 + 1)

使用map方法传入计算表达式,对第二个字段进行加1操作,然后得到新的mapStream

同时,也支持自定义实现MapFunction接口,编写自己的逻辑,做一些复杂的操作。
例如:

// 通过指定MapFunction
val mapStream: DataStream[(String, Int)] = dataStream.map(new MapFunction[(String, Int), (String, Int)] {
  override def map(t: (String, Int)): (String, Int) = {
    (t._1, t._2 + 1)}
  })

不过自定义实现MapFunction一般用于java。


DataStream<Integer> dataStream = env.fromElements(1, 2, 3, 4);
DataStream<Integer> result = dataStream.map(new AddOne());
// 自定义MapFunction
public static class AddOne implements MapFunction<Integer, Integer> {
    @Override
    public Integer map(Integer integer) throws Exception {
        return integer + 1;
    }
}

输出为:

1> 5
2> 2
4> 4
3> 3

  • flatMap()

对于map()来说,实现MapFunction也只是支持一对一的转换。
那么有时候你需要处理一个输入元素,但是要输出一个或者多个输出元素的时候,就可以用到flatMap()。

void flatMap(T value,
             Collector<O> out)
      throws Exception
      
The core method of the FlatMapFunction. Takes an element from the input data set and transforms it into zero, one, or more elements.
Parameters:
value - The input value.
out - The collector for returning result values.

FlatMapFunction<T,O>
T - Type of the input elements.
O - Type of the returned elements.
其中T为输入类型,O为输出类型

例如,对每一行的文本进行切割(如hive中的一行数据通常用,进行分割)。

scala版本

val dataStream:DataStream[String] = environment.fromCollections()
val resultStream[String] = dataStream.flatMap { str => str.split(" ") }

java版本

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

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<String> dataStream = env.fromElements("a,b", "c,d,e", "f,g");

        DataStream<String> dataStream1 = dataStream.flatMap(new SplitData());
        dataStream1.print();
        env.execute("s");


    }

    public static class SplitData implements FlatMapFunction<String, String> {
        @Override
        public void flatMap(String s, Collector<String> collector) throws Exception {
            for (String key : s.split(",")) {
                collector.collect(key);
            }
        }
    }

输出为:

3> a
3> b
1> f
1> g
4> c
4> d
4> e

使用接口中提供的 Collector ,flatmap() 可以输出你想要的任意数量的元素,也可以一个都不发。

另外还有个Filter

  • Filter

DataStream->DataStream

根据条件进行判断,用于满足条件的数据进行输出,不满足就过滤掉。

java版本

DataStream<Integer> dataStream2 = env.fromElements(1, 2, 3, 4);

        DataStream<Integer> dataStream3 = dataStream2.filter((FilterFunction<Integer>) (num) -> {
            return num - 2 > 0;
        });

scala版本

val filter: DataStream[Int] = dataStream.filter(_ - 2 > 0)

输出为:

1> 3
2> 4

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink中的算子可以分为三类:转换算子、聚合算子和窗口算子。下面对它们进行详细介绍。 1. 转换算子 转换算子用于将一个数据流转换为另一个数据流,常用的转换算子有: - Map:将每个输入元素应用到一个函数上,输出一个新元素。 - FlatMap:将每个输入元素应用到一个函数上,输出零个、一个或多个新元素。 - Filter:将每个输入元素应用到一个谓词上,输出满足谓词条件的元素。 - KeyBy:根据指定的键将流分组。 - Reduce:对分组后的流中的元素进行归约操作。 2. 聚合算子 聚合算子用于对数据流进行聚合操作,常用的聚合算子有: - Sum:对输入元素进行求和操作。 - Min:对输入元素进行求最小值操作。 - Max:对输入元素进行求最大值操作。 - Count:对输入元素进行计数操作。 3. 窗口算子 窗口算子用于将数据流分割为有限大小的窗口,并对窗口中的元素进行操作,常用的窗口算子有: - Tumbling Window:将数据流分成不重叠的固定大小的窗口。 - Sliding Window:将数据流分成固定大小的窗口,并且这些窗口可以重叠。 - Session Window:将数据流根据一定的时间间隔将数据流分成不固定长度的窗口。 除了以上算子Flink还提供了一些其他的算子,例如: - Union:将两个或多个数据流合并为一个数据流。 - Connect和CoMap:用于将两个数据流连接在一起,并在连接后对两个数据流进行不同的转换操作。 - Iterate:允许在数据流上进行迭代操作。 总结:Flink中的算子非常丰富,可以满足各种需求,通过合理使用这些算子,可以轻松构建出高效、可扩展的实时数据处理系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值