Flink CEP 示例(可运行)

本文提供了一个Flink CEP的实例,展示了如何处理实时数据流中的特定事件模式。通过定义一个用户先点击后立即购买的模式,然后从Kafka消费者中获取数据并转换为`UserAction`类,将此模式应用于流数据,最终通过`PatternStream`的`select`函数获取匹配的事件并打印结果。
package com.cep

import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.cep.PatternSelectFunction
import org.apache.flink.cep.pattern.conditions.SimpleCondition
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.cep.scala.{CEP, PatternStream}
import org.apache.flink.streaming.api.scala.KeyedStream
import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, createTypeInformation}
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer

import java.util.Properties
import java.util

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

    val initProps = new Properties()
    initProps.setProperty("bootstrap.servers", "cwh66:9092")
    initProps.setProperty("group.id", "test22")

    // 定义一个cep pattern模式。此处复杂的事务为:用户click后马上进行buy操作
    val pattern: Pattern[UserAction, UserAction] =
      Pattern.begin[UserAction]("start").where(new SimpleCondition[UserAction] {
        override def filter(t: UserAction): Boolean = t.action.trim.equals("click")
      })
        .next("middle").where(new SimpleCondition[UserAction] {
        override def filter(t: UserAction): Boolean = t.action.trim.equals("buy")
      })

    // 获取一个普通的流
    val input: KeyedStream[UserAction, String] = env.addSource(
      new FlinkKafkaConsumer[String]("test2", new SimpleStringSchema(), initProps))
      .map { line =>
        val strs: Array[String] = line.split(",")
        UserAction(strs(0), strs(1).toLong, strs(2), strs(3)) // 将记录转换为UserAction类型
      }.keyBy(_.name)

    // 将我们定义好的cep pattern应用于这个普通的流
    val patternStream: PatternStream[UserAction] = CEP.pattern(input, pattern).inProcessingTime() or inEventTime()
     //注意必须添加inProcessingTime() or inEventTime(),否则程序不能输出数据

    // 通过select算子获取符合pattern的事务数据,并打印结果
    val patternResult= patternStream.select(new PatternSelectFunction[UserAction, String] {
      override def select(map: util.Map[String, util.List[UserAction]]): String = {
        val click: UserAction = map.get("start").iterator().next()
        val buy: UserAction = map.get("middle").iterator().next()
        // 打印用户的名称,点击和购买的时间
        s"name: ${click.name}, click: ${click.timestamp}, buy: ${buy.timestamp}"
      }
    })

    patternResult.print()

    env.execute("click buy test")

  }


}
case class UserAction(ip: String, timestamp: Long,name: String,  action: String)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值