实现有状态的函数

背景:实现传感器的警报。监控每一个传感器的温度差异,如果温度差大于一个阈值,则添加到报警列表。代码如下:
package com.zy.chapter07

import com.zy.chapter05.SensorReading
import org.apache.flink.api.common.functions.RichFlatMapFunction
import org.apache.flink.api.common.state.{ValueState, ValueStateDescriptor}
import org.apache.flink.configuration.Configuration
import org.apache.flink.util.Collector

/**

  • create 2020-01-29
  • author zhouyu
  • desc 温度警报函数,测试Flink的valuestate状态控制
    */
    class TemperatureAlertFunction(val thresold:Double)
    extends RichFlatMapFunction[SensorReading,(String,Double,Double)]{
    //状态对象引用
    private var lastTempState : ValueState[Double] = _

override def open(parameters: Configuration): Unit = {
//create state descriptor
val descriptor = new ValueStateDescriptorDouble
//get state reference
lastTempState = getRuntimeContext().getStateDouble
}

override def flatMap(value: SensorReading, out: Collector[(String, Double, Double)]): Unit = {
//从状态中获取上一次的温度
val lastTemp = lastTempState.value()
val tempDiff = (value.temperature - lastTemp).abs
if(tempDiff > thresold){
out.collect((value.id,value.timestamp,value.temperature))
}
this.lastTempState.update(value.temperature)
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值