flink 常用算子之map、filter和flatMap

Transformation各算子可以对Flink数据流进行处理和转化,是Flink流处理非常核心的API。

map

map算子对一个DataStream中的每个元素使用用户自定义的map函数进行处理,每个输入元素对应一个输出元素,最终整个数据流被转换成一个新的DataStream。输出的数据流DataStream[OUT]类型可能和输入的数据流DataStream[IN]不同。

如业务需求可以对一些数据进行拼接字符,倍数扩大等场景使用。

我们可以重写MapFunctionRichMapFunction来自定义map函数:

我们新建一个map实现MapFunction接口并重写方法。我们实现的方法很简单就是将数据流中的元素拼接一段字符串。

将其作为参数传递到stream的map方法中。

但是运行时报错了

这块我也研究了半天/(ㄒoㄒ)/~~,此处需要注意的是,map()方法传入的参数需要严格指定泛型,来适应上下文环境,否则就会报错。因为我们做出修改。

运行后打印正常

filter

filter算子对每个元素进行过滤,过滤的过程使用一个filter函数进行逻辑判断。对于输入的每个元素,如果filter函数返回True,则保留,如果返回False,则丢弃。filter的输入和输出数据类型一致。

flatMap

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

有一个输出时,完全可以当作map来用

flatMap支持一种特殊的数据类型Tuple

Tuple

Java API提供了Tuple1到Tuple25的类。Tuple的每个字段可以是任意的Flink支持的数据类型。关于Tuple中的数据访问,可以通过tuple.f4或者使用getter方法:tuple.getField(int position) 位置索引从0开始,比如一个Tuple2就可以理解为一个map但是相同的key不会重复,或者就是一个实体类。

 我们也可以在此基础上进行汇总求和

注意,虽然flatMap可以完全替代mapfilter,但Flink仍然保留了这三个API,主要因为mapfilter的语义更明确,更明确的语义有助于提高代码的可读性。map可以表示一对一的转换,代码阅读者能够确认对于一个输入,肯定能得到一个输出;filter则明确表示发生了过滤操作。

keyBy

DataStream  ->  KeyedStrem 逻辑的将一个流拆分成不相交的分区,每个分区包含具有相同key的元素,在内部以hash的方式实现的

滚动聚合算子

这些算子可以针对KeyedStrem的每一个直流做聚合

 sum()

 min()

 max()

 minBy()

 maxBy()

对于单一的基本类型的数据流,根本就无法进行分组操作。

所以我们创建一组简单的实体数据流进行keyBy操作。

keyBy参数类型有两种 int 和 string,而int类型的参数只适用于类型为tuple的数据,而我们的数据为pojo,所以需要传入string类型的字段。

还有一点值得注意的地方就是这两种方法的返回值的输出泛型是tuple类型

这是为什么呢?因为仔细观察keyBy的参数是(int...fields),说明可以传入多个参数。按多个key进行分组。多个key可能类型都不一样所以没法指定具体的分组后类型。所以就包装成了tuple类型返回。

max只是将实体中的max字段进行修改,其他字段并没有发生修改,优势会有歧义。

所以我们可以使用maxBy()

整个数据实体都发生了改变。

flink window

flink time

flink state

checkpoint

savepoint

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink 中的算子可以分为三类:转换算子(Transformation)、数据源算子(Source)、数据汇算子(Sink)。 1. 转换算子 转换算子用于对数据进行转换和处理,常用算子有: - map:对每条数据进行一定的处理,将其转换为另一种形式输出。 - flatMap:与 map 类似,但是可以输出多个结果。 - filter:对数据进行过滤,只保留符合条件的数据。 - keyBy:按照指定的 key 进行分组,将具有相同 key 的数据分到同一个分区中。 - reduce:对分组后的数据进行聚合计算,输出一个结果。 - sum/min/max:对分组后的数据进行求和/最大值/最小值计算,输出一个结果。 - window:将数据按照时间窗口进行分组,进行聚合计算。 - join:将两个流的数据按照指定的条件进行连接,输出一个新的流。 - union:将两个流合并成一个流。 - coMap/coFlatMap:将两个流的数据进行合并处理,输出一个新的流。 2. 数据源算子 数据源算子用于从外部数据源中读取数据,常用算子有: - socketTextStream:从指定的 Socket 地址读取文本数据。 - readTextFile:从指定的文件路径读取文本数据。 - readCsvFile:从指定的 CSV 文件路径读取 CSV 数据。 - addSource:从自定义数据源中读取数据。 3. 数据汇算子 数据汇算子用于将数据写入到外部系统中,常用算子有: - print:将数据打印到控制台。 - writeAsText:将数据以文本形式写入到指定的文件路径。 - writeAsCsv:将数据以 CSV 形式写入到指定的文件路径。 - addSink:将数据写入到自定义的数据汇中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值