Scala 如何为以下内容创建模式和警报
我有这个代码,它给出了locationID和temp,我想要一个模式,每当temp>THRESHOLD\u温度 我试过:-Scala 如何为以下内容创建模式和警报,scala,apache-kafka,sbt,apache-flink,Scala,Apache Kafka,Sbt,Apache Flink,我有这个代码,它给出了locationID和temp,我想要一个模式,每当temp>THRESHOLD\u温度 我试过:- val pattern1: Pattern[Event,_] = Pattern.begin[Event]("first") .subtype(Event.getClass) .where( (evt -> evt.getTemp()) >= TEMPERATURE_THRESHOLD)
val pattern1: Pattern[Event,_] = Pattern.begin[Event]("first")
.subtype(Event.getClass)
.where( (evt -> evt.getTemp()) >= TEMPERATURE_THRESHOLD)
.within(Time.seconds(5))
val patternStream: PatternStream[Event] = CEP.pattern(f,pattern1)
val alerts: DataStream[String] = patternStream.flatSelect(
(in: Map[String,String], out: Collector[String]) => {
var first: String = in.get("first")
if (first >= TEMPERATURE_THRESHOLD){
out.collect("Temperature above danger zone")
}
}
)
这是要发出警报的代码:-
case class Event(locationID: String, temp: Double)
val TEMPERATURE_THRESHOLD: Double = 50.00
val see: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val properties = new Properties()
properties.setProperty("zookeeper.connect", "localhost:2181")
properties.setProperty("bootstrap.servers", "localhost:9092")
val src = see.addSource(new FlinkKafkaConsumer010[ObjectNode]("broadcast",
new JSONKeyValueDeserializationSchema(false), properties))
var ask = src.map{
r => r.get("value")
}
var data = ask.map { v => {
val loc = v.get("locationID").asInstanceOf[String]
val temperature = v.get("temp").asDouble()
(loc, temperature)
}}
// data.print()
var f = data.keyBy(
v => v._2
)
f.print()
see.execute()
模式正在过载,而且flatSelect用于检测事件序列中的模式,这并不真正适合这个特定问题。查找temp>阈值不需要模式匹配的事件——一个简单的过滤器或flatmap就可以完成这项工作。例如,您可以有一个平面图,用于将温度过高的每个事件转换为警报,并忽略所有其他事件 至于你基于CEP的解决方案,我不明白你说的是它出了什么问题。但有几件事看起来不对劲。
内的子句不会做任何事情:因为您的模式只有一个事件长,所以它们没有任何持续时间。你通过温度来输入数据流,这看起来很奇怪