cep 规则

简单的 案例

 

import org.apache.flink.cep.PatternSelectFunction
import org.apache.flink.cep.scala.CEP
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

import java.util


object Test05 {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
 //   env.enableCheckpointing(1000)
    val text = env.socketTextStream("hdp1", 9999)
   
    val mapDS: DataStream[MyLogin] = text.map(t => {
      val li: Array[String] = t.split(",")
      MyLogin (li(0), li(1), li(2), li(3).trim.toLong*1000)
    })

    val timeDS: DataStream[MyLogin] = mapDS.assignAscendingTimestamps(_.ts)


    val pattern = Pattern.begin[MyLogin]("start")
      .where(_.cz.equals("fail"))
      .next("middle").where(_.cz.equals("fail"))
      .within(Time.seconds(5))

    val patternStream = CEP.pattern(timeDS, pattern)
    val ps: DataStream[String] = patternStream.select(new MyLoginSelect)
    ps.print()
    env.execute()

  }
}
case class MyLogin (uid:String,pid:String,cz:String,ts:Long)
class MyLoginSelect extends PatternSelectFunction[MyLogin,String]{
  override def select(map: util.Map[String, util.List[MyLogin]]): String = {
    "连续登录失败"+map
  }
}

2.案例

 

import org.apache.flink.cep.{PatternSelectFunction, PatternTimeoutFunction}
import org.apache.flink.cep.scala.CEP
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

import java.util

/**
 * @author jiasongfan
 * @date 2022/6/29
 * @apiNote
 */
object Test06 {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    //   env.enableCheckpointing(1000)
    val text = env.socketTextStream("hdp1", 9999)
    val mapDS: DataStream[MyPay] = text.map(t => {
      val li: Array[String] = t.split(",")
      MyPay (li(0), li(1), li(2).trim.toLong*1000)
    })

    val timeDS: DataStream[MyPay] = mapDS.assignAscendingTimestamps(_.ts)
    val keyDS: KeyedStream[MyPay, String] = timeDS.keyBy(_.uid)
    val pattern = Pattern.begin[MyPay]("start").where(_.stats.equals("create"))
     // .next("middle").subtype(classOf[SubEvent]).where(_.getVolume >= 10.0)
      .followedBy("end").where(_.stats.equals("pay"))
      .within(Time.seconds(10))

    val patternStream = CEP.pattern(keyDS, pattern)

    val ps1: DataStream[String] = patternStream.select(new MyPaySelect)
    ps1.print()

    //超时数据
    val tag1 = new OutputTag[String]("late-data")
    val ps2: DataStream[String] = patternStream.select(tag1, new MyTimepay, new MyPaySelect)
    ps2.getSideOutput(tag1).print()

    env.execute()
  }
}
case class MyPay (uid:String,stats:String,ts:Long)
class MyPaySelect extends  PatternSelectFunction[MyPay,String]{
  override def select(map: util.Map[String, util.List[MyPay]]): String = {
    "正常数据"+map
  }
}
class MyTimepay extends PatternTimeoutFunction[MyPay,String]{
  override def timeout(map: util.Map[String, util.List[MyPay]], l: Long): String = {
    l+"超时数据"+map
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink CEP (Complex Event Processing) 是Apache Flink的一个组件,用于处理和查询数据流中的复杂事件模式。动态规则是指在运行时能够动态修改和更新事件模式的规则。具体而言,在使用Flink CEP进行事件处理时,动态规则允许我们根据实时需求对规则进行灵活调整。 动态规则的实现可以通过在Flink CEP中使用可扩展的API。Flink CEP提供了创建和管理事件规则的方法,这些规则可以根据特定的需求进行灵活的增删改。通过使用动态规则,我们可以在不中断系统运行的情况下动态地添加、删除或修改事件的匹配规则。这对于处理实时数据流的应用非常有用,因为业务需求往往会随着时间的推移而变化,需要根据新的规则及时适应数据的变化。 使用动态规则的一个实际场景是,当我们需要监控在线交易时的欺诈行为。我们可以配置一组初始规则来检测可能的欺诈模式。然而,在实际应用中,新的欺诈模式可能会不断出现,将新的规则手动添加到系统中效率低且不够实时。因此,我们可以使用Flink CEP的动态规则功能,根据欺诈行为的新模式实时更新规则,确保系统始终能够检测到最新的欺诈模式,提高交易监控的准确性和效率。 总之,Flink CEP的动态规则功能提供了一种灵活的方式来处理实时事件流中的复杂模式匹配需求。通过实时地更新和更改规则,我们可以及时适应业务需求的变化,提高系统的实时性和准确性。这在许多应用场景中都是非常有价值的,特别是那些需要随时适应新规则的实时数据处理任务中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值