flink的三种函数定义

  • 普通函数类
    指定了输入类型与返回类型,功能同map算子相似
  • 富函数类
    涉及到了资源相关,例如连接数据库与关闭数据库等操作写在代码中
    代码中在建立连接的时候输出了一句话,执行程序可以看到,打印该话只执行了一次
  • 底层处理函数api
    添加了时间语义,触发器概念,灵活使用触发器,实现时间间隔内的各种操作
package com.uu.two

import java.sql
import java.sql.DriverManager

import com.uu.two.utils.DateTrans
import org.apache.flink.api.common.functions.{MapFunction, RichMapFunction}
import org.apache.flink.api.common.state.ValueStateDescriptor
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.KeyedProcessFunction
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.util.Collector
case class Humman(id:Long,name:String,sex:String)
object FuncOne {
  def main(args: Array[String]): Unit = {
    val see = StreamExecutionEnvironment.getExecutionEnvironment
    //设置分片数
    see.setParallelism(1)
    import org.apache.flink.api.scala._
    val value = see.socketTextStream("152.136.136.15", 9999)
    //返回样例类对象
    val phoneMap = value.map(x => {
      val arrayPhone = x.split(" ")
      new Humman(arrayPhone(0).trim.toLong, arrayPhone(1), arrayPhone(2))
    })

    phoneMap
//        .keyBy(_.id.toString)
//      .process(new MoniterFunc())
//      .process(new MoniterFunc())
        .map(new MyRichFunc)
//        .map(new MyMapFunc)
      .print()
    see.execute("FuncOne")
  }

  //自定义函数对输入内容进行增强
  class MyMapFunc extends MapFunction[Humman,String]{
    override def map(value: Humman): String = {
      "id:"+value.id+
      "名字:"+value.name+
      "性别:"+value.sex
    }
  }

  //定义mysql的连接富函数,拿到地址
  class MyRichFunc extends RichMapFunction[Humman,String]{
    //配置对象
    var conn:sql.Connection = _
    //预处理函数
    override def open(parameters: Configuration): Unit = {
      conn = DriverManager.getConnection("jdbc:mysql://localhost/sqltest","root","123")
      println("建立同数据库的连接")
    }

    override def map(value: Humman): String = {
      //返回结果定义
      var addr:String = ""
      //获取id值
      val id = value.id
      val statement = conn.prepareStatement("select address from student3 where id = " + id)
      val result = statement.executeQuery()
      if(result.next()){
        addr = result.getString(1)
      }
      statement.close()
        "id:"+value.id+
        "名字:"+value.name+
        "性别:"+value.sex+
        "地址:"+addr
    }

    override def close(): Unit = {
      conn.close()
    }
  }

  //底层处理器函数api
  //参数,key类型,输入类型,输出类型
  class MoniterFunc() extends KeyedProcessFunction[String,Humman,String]{
      //使用一个状态记录时间
      lazy val timeState = getRuntimeContext.getState(new ValueStateDescriptor[Long]("time", classOf[Long]))
    //处理流程
    override def processElement(value: Humman, ctx: KeyedProcessFunction[String, Humman, String]#Context, out: Collector[String]): Unit = {
      //获取具体的时间
      val current: Long = timeState.value()
      //若性别为男,定义触发器,5s触发
      if (value.sex == "man"){
        val processTime: Long = ctx.timerService().currentProcessingTime()
        //5s后触发
        val endTime = processTime + 5000L
        //注册触发器
        ctx.timerService().registerProcessingTimeTimer(endTime)
        timeState.update(endTime)
      }
      if(value.sex == "women"){
        ctx.timerService().deleteProcessingTimeTimer(current)
        timeState.clear()
      }
    }
    //触发函数
    override def onTimer(timestamp: Long, ctx: KeyedProcessFunction[String, Humman, String]#OnTimerContext, out: Collector[String]): Unit = {
      val str = "触发时间:" + DateTrans.getStandTime(timestamp) + "key值" + ctx.getCurrentKey
      out.collect(str)
      timeState.clear()
    }
  }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值