五、ProcessFunction之类函数相关总结以及SideOutput(侧输出)

本文介绍了Flink中的处理函数,包括ProcessFunction、CoProcessFunction、KeyedProcessFunction和ProcessWindowFunction的使用场景和特点。重点讨论了它们如何处理时间戳、水位线和定时器,并强调了ProcessFunction和CoProcessFunction的区别。此外,文章还详细阐述了SideOutput作为侧输出的功能,允许处理函数将数据输出到额外的流中。
摘要由CSDN通过智能技术生成


一、处理函数是什么?

由代码理解,基本上与process(单词)相关的函数都叫处理函数。

高级的转换流函数,可以实现对数据进行更精确的处理的函数,有些可以获得暴露出的时间戳和水位线。

二、为什么需要使用处理函数?

  • 由于之前的转换算子是无法获取时间戳信息和水位线信息以及定时事件等。

三、处理函数如何使用?

1、处理函数的种类:

  • ProcessFunction(常用)
  • KeyedProcessFunction(常用)
  • CoProcessFunction(常用)
  • ProcessJoinFunction
  • BroadcastProcessFunction
  • KeyedBroadcastProcessFunction
  • ProcessWindowFunction(常用)
  • ProcessAllWindowFunction

特点:

  • 直接或者间接继承了AbstractRichFunction 方法,都可以重写open()和close()方法
  • processElement(v: INT, ctx: Context, out: Collector[OUT]), 流中的每一个元素都会调用这个方法,调用结果将会放在Collector数据类型中输出。Context可以访问元素的时间戳,元素的key,以及TimerService时间服务。Context还可以将结果输出到别的流(side outputs)。
  • onTimer(timestamp: Long, ctx: OnTimerContext, out: Collector[OUT])是一个回调函数。当之前注册的定时器触发时调用。参数timestamp为定时器所设定的触发的时间戳。Collector为输出结果的集合。OnTimerContext和processElement的Context参数一样,提供了上下文的一些信息,例如firing trigger的时间信息(事件时间或者处理时间)。

1.1、ProcessFunction

如果要使用ProcessFunction,需要该类继承抽象类ProcessFunction()方法并实现其中的抽象方法。
可以不进行Keyby之后使用,并对流中的每条元素都进行遍历以及操作。获取水位线以及定时,侧输出等操作。
package org.apache.flink.streaming.api.functions;

import org.apache.flink.annotation.PublicEvolving;
import org.apache.flink.api.common.functions.AbstractRichFunction;
import org.apache.flink.streaming.api.TimeDomain;
import org.apache.flink.streaming.api.TimerService;
import org.apache.flink.util.Collector;
import org.apache.flink.util.OutputTag;

@PublicEvolving
public abstract class ProcessFunction<I, O> extends AbstractRichFunction {
   
	private static final long serialVersionUID = 1L;
	public abstract void processElement(I value, Context ctx, Collector<O> out) throws Exception;
	public void onTimer(long timestamp, OnTimerContext ctx, Collector<O> out) throws Exception {
   }

	
	public abstract class Context {
   
		public abstract Long timestamp();
		public abstract TimerService timerService();
		public abstract <X> void output(OutputTag<X> outputTag, X value);
	}

	public abstract class OnTimerContext extends Context {
   
		public abstract TimeDomain timeDomain();
	}

}

特点:

  1. 前面可以没有keyBy()算子。
  2. 可以对一条流中每条数据进行遍历操作。
  3. 可以获取操作时间,水位线。
  4. 可以进行注册定时器操作。
  5. 可以向下游发送数据。

1.2、CoProcessFunction

源码如下:


package org.apache.flink.streaming.api.functions.co;

import org.apache.flink.annotation.PublicEvolving;
import org.apache.flink.api.common.functions.AbstractRichFunction;
import org
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值