Flink-側輸出流(SideOutput)及用側輸出流進行分流操作

GitHub

https://github.com/SmallScorpion/flink-tutorial.git

側輸出流(SideOutput)

大部分的DataStream API的算子的輸出是單一輸出,也就是某種數據類型的流。除了split算子,可以將一條流分成多條流,這些流的數據類型也都相同。process function的side outputs功能可以產生多條流,並且這些流的數據類型可以不一樣。一個side output可以定義爲OutputTag[X]對象,X是輸出流的數據類型。process function可以通過Context對象發射一個事件到一個或者多個side outputs。

測試

import com.atguigu.bean.SensorReading
import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

/**
 * 用側輸出流實現一個分流操作
 */
object SideOutputTest {
  def main(args: Array[String]): Unit = {

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    val inputDStream: DataStream[String] = env.socketTextStream("hadoop102", 7777)

    val dataDstream: DataStream[SensorReading] = inputDStream.map(
      data => {
        val dataArray: Array[String] = data.split(",")
        SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
      })

    val resultDStrem: DataStream[SensorReading] = dataDstream

      .process( SideOutputTest(30.0) )

    dataDstream.print("data")
    // 主流爲高於30.0度
    resultDStrem.print( "high" )
    // 側輸出流需要進行獲取
    resultDStrem.getSideOutput( new OutputTag[SensorReading]("low-temp") ).print("low")

    env.execute("SideOutput test job")
  }

}

/**
 * 自定義一個方法,判斷溫度是否大於30度,小於30度輸出到測輸出流,大於30主流
 * @param tpr
 */
case class SideOutputTest(tpr: Double) extends ProcessFunction[SensorReading, SensorReading]{

  override def processElement(value: SensorReading, ctx: ProcessFunction[SensorReading, SensorReading]#Context, out: Collector[SensorReading]): Unit = {

    if( value.temperature >= tpr ){
      out.collect( value )
    }else{
      ctx.output( new OutputTag[SensorReading]("low-temp"), value)
    }

  }

}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章