1. 为什么需要Side Stream
在处理一个数据源时,往往需要 将该源中的不同类型的数据做分割处理,如果使用 filter 算子对数据源进行筛选分割的 话,势必会造成数据流的多次复制,造成不必要的性能浪费;flink 中的侧输出就是将数据 流进行分割,而不对流进行复制的一种分流机制。flink 的侧输出的另一个作用就是对延时迟到的数据进行处理,这样就可以不必丢弃迟到的数据
2. 如何使用Side Stream
-
要使用 Side Output 的话,首先需要做的是定义一个 OutputTag 来标识 Side Output,代表这个 Tag 是要收集哪种类型的数据,如果是要收集多种不一样类型的数据,那么你就需要定义多种OutputTag
val failTag: OutputTag[StationLog] = new OutputTag[StationLog]("failTag") val busyTag: OutputTag[StationLog] = new OutputTag[StationLog]("busyTag") val barringTag: OutputTag[StationLog] = new OutputTag[StationLog]("barringTag")
-
然后呢,可以使用下面几种函数来处理数据,在处理数据的过程中,进行判断将不同种类型的数据存到不同的 OutputTag 中去
- ProcessFunction
- KeyedProcessFunction
- CoProcessFunction
- ProcessWindowFunction
- ProcessAllWindowFunction
class CreateSideOutputStream(tag: OutputTag[StationLog]) extends ProcessFunction[StationLog, StationLog] { override def processElement(value: StationLog, context: ProcessFunction[StationLog, StationLog] #Context, out: Collector[StationLog]): Unit = { if(value.callType.equals