除了从DataStream操作输出主结果流外,也可以生成任一数量的额外的侧输出流.结果流可以和主输出流的类型可以不匹配,并且侧输出流可以有不同类型.侧输出流的操作当你分流时非常有用,之前你需要先复制一个流再过滤出来,有了侧输出流,就不需要这样操作.
当使用侧输出流时,首先需要定义一个OutputTag,它将要被用来确定一个侧输出流.
val outputTag = OutputTag[String]("side-output")
注意:侧输出流的类型是根据侧输出流包括元素的类型来确定.
可以从以下方法中来把数据输出到侧输出流
- ProcessFunction
- KeyedProcessFunction
- CoProcessFunction
- KeyedCoProcessFunction
- ProcessWindowFunction
- ProcessAllWindowFunction
在以上的函数中可以用参数Context来暴露给用户发送数据到侧输出流. 下面例子是用ProcessFunction
来发送数据到侧输出流.
val input: DataStream[Int] = ...
val outputTag = OutputTag[String]("side-output")
val mainDataStream = input
.process(new ProcessFunction[Int, Int] {
override def processElement(
value: Int,
ctx: ProcessFunction[Int, Int]#Context,
out: Collector[Int]): Unit = {
// emit data to regular output
out.collect(value)
// emit data to side output
ctx.output(outputTag, "sideout-" + String.valueOf(value))
}
})
可以通过DataStream操作结果上使用getSideOutput(OutputTag)来获得侧输出流.将得到一个与侧输出流一样类型的DataStream.
val outputTag = OutputTag[String]("side-output")
val mainDataStream = ...
val sideOutputStream: DataStream[String] = mainDataStream.getSideOutput(outputTag)