侧输出流
package api
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.util.Collector
object sideOutut {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val stream = env.socketTextStream("node02", 5515)
val dataStream = stream.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).trim.toLong, dataArray(2).trim.toDouble)
}
)
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[SensorReading](Time.milliseconds(1000)) {
override def extractTimestamp(t: SensorReading): Long = t.timestamp * 1000
})
val Dstream = dataStream
.keyBy(_.id)
.process(new sideProcess())
Dstream.print()
Dstream.getSideOutput(new OutputTag[String]("freezing")).print()
env.execute()
}
}
class sideProcess() extends ProcessFunction[SensorReading, SensorReading] {
lazy val alertOutput = new OutputTag[String]("freezing")
override def processElement(value: SensorReading, ctx: ProcessFunction[SensorReading, SensorReading]#Context, out: Collector[SensorReading]) = {
if (value.temperature < 32.0) {
ctx.output(alertOutput, "freezing alert" + value.id)
}
else {
out.collect(value)
}
}
}