Flink项目开发记录之合并数据流

Flink项目开发记录之合并数据流

项目目前的jar包环境:flink1.9.0
这边就是常用jar,就不列出了,合并流我这边选择是使用相同的key流然后设置时间的上下限,进行合流

项目背景:由于业务需求,将原本的从kafka接收的数据流,经过业务A处理,变成了a,b两个dataStream,a、b两个流分别经过若干个业务处理后,需要合并到一个流中接着经过业务B、C、D等处理在Sink到ES中,所以上flink官网学习了一下合流的过程记录下来

代码如下:

 val deviceStreamCombind = staData1.map(x=>{
      (-1, x._2)
    })//需要合并的副流
    
//stationDataBefore2主流
   val stationDataBefore3 =  stationDataBefore2.keyBy(_._1).intervalJoin(deviceStreamCombind.keyBy(_._1)).between(org.apache.flink.streaming.api.windowing.time.Time.seconds(-5),org.apache.flink.streaming.api.windowing.time.Time.seconds(5))
      .process(new ProcessJoinFunction[(Int,Array[StationData]),(Int,Array[StationData]),(Array[StationData])] {
        override def processElement(left: (Int, Array[StationData]), right: (Int, Array[StationData]), ctx: ProcessJoinFunction[(Int, Array[StationData]), (Int, Array[StationData]), Array[StationData]]#Context, out: Collector[Array[StationData]]): Unit = {
          val result = left._2 ++ right._2
          out.collect(result)
        }
      }).flatMap(new RichFlatMapFunction[Array[StationData],StationData] {
      override def flatMap(value: Array[StationData], out: Collector[StationData]): Unit = {
        value.foreach(x=>{
          out.collect(x)
        })
      }
    })
     .filter(_ != null)

intervalJoin方法必须是在KeyedStream下才能调用,所以人为的将key设置为-1,而之后的between是必须调用的,它的作用是将主流的时间进行一个范围,分别加上上下限(这也就是为什么下限要为负数),可以通过IntervalJoinOperator下的processElement方法进行查看
Flink项目开发记录之合并数据流_第1张图片
这边需要设置一个执行环境的事件时间在这里插入图片描述
如果不设置此时间的话,record.getTimestamp为负数将会报错(如果你没有认为的设置水印,flink将以当前系统的时间自动获取为timestamp),设置为事件时间类型后,才可执行(源码中有判断当前的时间类型是否为事件时间,合流必须使用事件时间)
之后的便是常规的new ProcessJoinFunction类,类的类型只要按照提示输入流1和流2的类型以及指定最后的输出类型即可

你可能感兴趣的:(flink,合并流,flink)