如何在Spark流中获取当前批处理时间戳(DStream)?
我有一个火花流应用程序,其中输入数据将进行多次转换。
我需要在执行期间使用当前时间戳来验证输入数据中的时间戳。
如果我与当前时间进行比较,那么时间戳可能与每个RDD转换执行不同。
有什么方法可以获取时间戳,特定的Spark流微批处理何时开始或者它属于哪个微批处理间隔?
答案 0 :(得分:6)
dstream.foreachRDD((rdd, time)=> {
// time is scheduler time for the batch job.it's interval was your window/slide length.
})
答案 1 :(得分:2)
dstream.transform(
(rdd, time) => {
rdd.map(
(time, _)
)
}
).filter(...)
答案 2 :(得分:2)
延迟回复...但是如果它对某人有帮助,时间戳可以提取为毫秒。首先使用Java API定义一个函数进行格式化:
使用Java 7 - style util.Date/DateFormat:
def returnFormattedTime(ts: Long): String = {
val date = new Date(ts)
val formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val formattedDate = formatter.format(date)
formattedDate
}
或者,使用Java 8 - style util.time:
def returnFormattedTime(ts: Long): String = {
val date = Instant.ofEpochMilli(ts)
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault())
val formattedDate = formatter.format(date)
formattedDate
}
最后,使用foreachRDD方法获取时间戳:
dstreamIns.foreachRDD((rdd, time) =>
....
println(s"${returnFormattedTime(time.milliseconds)}")
....
)