我有一个运行在一天结束时的火花流应用程序,它使用上游应用程序发送的kafka事件。当前上游应用程序整天不断推送新数据,而我的消费者最终开始使用它。我想限制基于截止时间(例如每天下午6点)消耗的事件。是否有一种方法可以指定截止值以基于截止时间(例如kafka事件时间戳记)或其他东西来限制消耗的事件。下面是使用者代码
KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topicSet, kafkaParams))
答案 0 :(得分:1)
您可以根据timeStamp或时间或任何字段在处理过程中过滤掉事件。例如,假设您的事件是JSON,并且有一个名为hour的字段,它是事件时间的小时值。您可以轻松地仅选择在6之前创建的事件,如下所示。
directStream.foreachRDD { rdd =>
val eventDfRDD = rdd.filter(record => {
val option = JSON.parseFull(record).get.asInstanceOf[Map[String, String]]
option.get("hour") < 1800
})
}
答案 1 :(得分:1)
当您声明流上下文时,我们可以提及创建dsstream的截止时间,并且可以将该值传递给createDirectStream参数。请找到代码捕捉。在下面的代码中,以5秒为截止时间。因此每5秒钟将创建DStream RDD。
sc = spark.sparkContext
ssc = StreamingContext(sc,5)
kvs = KafkaUtils.createDirectStream(ssc, ['Topic-name'], {"metadata.broker.list": 'Server-name:port-number'},valueDecoder=serializer.decode_message)
答案 2 :(得分:0)
这是我实施的解决方案
1:当火花流作业开始时,将当前时间存储在变量中
val cuttoffTime = System.currentTimeMillis()
2:创建DirectStream
val directKafkaStream= KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topicSet, kafkaParams))
3:应用过滤条件 在foreach循环中,应用以下过滤条件
directKafkaStream.foreachRDD {rdd =>
val filterRdd = rdd.filter(_。timestamp()