Flink代码之两条流,基于时间间隔的Join,固定窗口的Join,connect,触发器(六)

本文深入探讨Flink流处理中的连接操作,包括有限流与无限流的`connect`及`CoProcessFunction`应用,详细阐述了基于时间间隔的Join方法,如用户点击日志与浏览日志的联合处理,以及两条流在固定窗口内的Join策略。此外,还介绍了如何利用触发器控制窗口计算,包括在窗口内按整数秒触发和基于事件时间整数秒触发的计算方式。

一、基于两条流的connect,和CoProcessFunction

1.实现一个有限流和无限流,connect,利用触发器控制打印输出的持续时长

import com.atguigu.day2.{
   
   SensorReading, SensorSource}
import org.apache.flink.api.common.state.ValueStateDescriptor
import org.apache.flink.api.scala.typeutils.Types
import org.apache.flink.streaming.api.functions.co.CoProcessFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

object CoProcessFunctionExample {
   
   
  def main(args: Array[String]): Unit = {
   
   
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    // 无限流
    val readings = env
      .addSource(new SensorSource)
      .keyBy(_.id)

    // 有限流
    val filterSwitches = env
      .fromElements(
        ("sensor_2", 10 * 1000L),
        ("sensor_7", 30 * 1000L)
      )
      .keyBy(_._1)

    readings
      .connect(filterSwitches)
      .process(new ReadingFilter)
      .print()

    env.execute()
  }

  class ReadingFilter extends CoProcessFunction[SensorReading, (String, Long), SensorReading] {
   
   
    // 初始化传送数据的开关,默认值是false
    // 只针对当前key可见的状态变量
    lazy val forwardingEnabled = getRuntimeContext.getState(
      new ValueStateDescriptor[Boolean]("filter-switch", Types.of[Boolean])
    )

    override def processElement1(value: SensorReading, ctx: CoProcessFunction[SensorReading, (String, Long), SensorReading]#Context, out: Collector[SensorReading]): Unit = {
   
   
      // 处理第一条流,无限流
      // 如果开关是true,将传感器数据向下游发送
      if (forwardingEnabled.value()) {
   
   
        out.collect(value)
      }
    }

    override def processElement2(value: (String, Long), ctx: CoProcessFunction[SensorReading, (String, Long), SensorReading]#Context, out: Collector[SensorReading]): Unit = {
   
   
      // 处理第二条流,有限流,只会被调用两次

      forwardingEnabled.update(true) // 打开开关

      // `value._2`是开关打开的时间
      val timerTs = ctx.timerService().currentProcessingTime() + value._2

      ctx.timerService().registerProcessingTimeTimer(timerTs)
    }

    override def onTimer(timestamp: Long, ctx: CoProcessFunction[SensorReading, (String, Long), SensorReading]#OnTimerContext, out: Collector[SensorReading]): Unit = {
   
   
      forwardingEnabled.update(false) // 关闭开关
    }
  }
}

二、基于时间间隔的Join

1.用户点击日志和用户浏览日志的Join

import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.co.ProcessJoinFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值