如何获取Spark流中的当前批处理时间戳

时间:2015-12-23 14:02:53

标签: java apache-spark spark-streaming

如何在Spark流中获取当前批处理时间戳(DStream)?

我有一个火花流应用程序,其中输入数据将进行多次转换。

我需要在执行期间使用当前时间戳来验证输入数据中的时间戳。

如果我与当前时间进行比较,那么时间戳可能与每个RDD转换执行不同。

有什么方法可以获取时间戳,特定的Spark流微批处理何时开始或者它属于哪个微批处理间隔?

3 个答案:

答案 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)}")
    ....
)