1.设置使用哪个来指定时间

如果使用的是秒 记得转换成毫秒 *1000
2.写状态

3.获取值和状态 (进行比较 设置下降状态)
4.设置定时器和删除定时器

定时器的代码查找
修改分数

最后输出 ontime

数据
001,math,10,1646038440
001,math,12,1646038441
001,math,11,1646038442
001,math,10,1646038443
001,math,9,1646038444
001,math,8,1646038445
001,math,7,1646038446
001,math,6,1646038447
001,math,7,1646038448
001,math,4,1646038449
代码
/**
* @author jiasongfan
* @date 2022/5/31
* @apiNote
*/
import org.apache.flink.api.common.state.{ValueState, ValueStateDescriptor}
import org.apache.flink.streaming.api.functions.{KeyedProcessFunction, ProcessFunction}
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.util.Collector
object Test04 {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val text = env.socketTextStream("hdp1", 9999)
val mapDS: DataStream[StuScore] = text.map(line => {
val li: Array[String] = line.split(",")
StuScore(li(0), li(1), li(2).trim.toInt,li(3).trim.toLong*1000)
})
//设置下滑的时间格式
val timeDS: DataStream[StuScore] = mapDS.assignAscendingTimestamps(_.ts)
val keyS: KeyedStream[StuScore, String] = timeDS.keyBy(_.id)
keyS.process(new MyPro2).print()
env.execute()
}
}
//<K, I, O>
class MyPro2 extends KeyedProcessFunction[String,StuScore,String]{
//上一次的数据
lazy val state: ValueState[Int] = getRuntimeContext
.getState(new ValueStateDescriptor[Int]("myState", classOf[Int]))
//上升或下降状态 也可以呃是string 我这里使用 1 和 -1
lazy val flag: ValueState[Int] = getRuntimeContext
.getState(new ValueStateDescriptor[Int]("flag", classOf[Int]))
//定时器 类型 long
lazy val timer: ValueState[Long] = getRuntimeContext
.getState(new ValueStateDescriptor[Long]("timer", classOf[Long]))
override def processElement(i: StuScore, context: KeyedProcessFunction[String, StuScore, String]#Context, collector: Collector[String]): Unit = {
//获取值和状态
val v: Int = state.value()
val f: Int = flag.value()
//判断是否是第一次下降
if(i.score<v){
//设置定时器
if(f==1){
context.timerService.registerEventTimeTimer(i.ts + 5000)
}
//记录
flag.update(-1)
}else{
//取消定时器
context.timerService.deleteProcessingTimeTimer(timer.value())
flag.update(1)
}
state.update(i.score)
}
override def onTimer(timestamp: Long, ctx: KeyedProcessFunction[String, StuScore, String]#OnTimerContext, out: Collector[String]): Unit = {
out.collect("连续下滑")
}
}
该博客介绍了如何使用Apache Flink处理实时数据流,通过设置定时器检测分数下降状态。代码示例展示了如何在KeyedProcessFunction中使用ValueState进行状态管理,设置和删除定时器,并在分数连续下滑时触发通知。
805

被折叠的 条评论
为什么被折叠?



