Flink的分流操作,分别用split-select和process-getSideOutput实现

package org.example

import org.apache.flink.streaming.api.scala._

import scala.collection.mutable.ArrayBuffer

object MyRandom {
  def main(args: Array[String]): Unit = {
  //创建执行环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //设置线程数为1
    env.setParallelism(1)
    //设置数据源为1到100的集合
    val arr = ArrayBuffer[Int]()
    for(i <- 1 to 100){
      arr.append(i)
    }
    val ds = env.fromCollection(arr)

//把数据源按指定规则split为奇数流和偶数流
    val res = ds.split(num => {
      if (num % 2 == 0) Seq("even")
      else Seq("odd")
    })

    val even = res.select("even")
    val odd = res.select("odd")

//打印输出奇数流和偶数流
    even.print("even")
    odd.print("odd")
//执行环境触发执行
    env.execute()

  }
}

执行结果如图显示:
在这里插入图片描述
上述的split方法上面有一条横线,显示即将过期,要用process方法来替代:

package org.example

import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

import scala.collection.mutable.ArrayBuffer

object MyRandom {
  def main(args: Array[String]): Unit = {
  //创建执行环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //设置线程数
    env.setParallelism(8)
    //设置数据源为1到100的集合
    val arr = ArrayBuffer[Int]()
    for(i <- 1 to 100){
      arr.append(i)
    }
    val ds = env.fromCollection(arr)

	//用process方法实现分流
    val res = ds.process(new EO())
    val odd = res.getSideOutput(new OutputTag[String]("otest"))
   	val even = res.getSideOutput(new OutputTag[String]("etest"))
   	
    even.print()
    odd.print()
    
    env.execute()

  }
}


class EO()extends ProcessFunction[Int,Int]{
  lazy val otag = new OutputTag[String]("otest")
  lazy val etag = new OutputTag[String]("etest")
  //重写processElement方法指定分流规则
  override def processElement(i: Int, context: ProcessFunction[Int, Int]#Context, collector: Collector[Int]): Unit = {
    if (i%2==0) context.output(etag,"even"+i)
    else context.output(otag,"odd"+i)
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值