在Spark流中,有带有time参数的forEachRDD,可以在其中花费该时间并将其用于不同的目的-元数据,在rdd中创建其他时间列,...
val stream = KafkaUtils.createDirectStream(...)
stream.foreachRDD { (rdd, time) =>
// update metadata with time
// convert rdd to df and add time column
// write df
}
在结构化流API中
val df: Dataset[Row] = spark
.readStream
.format("kafka")
.load()
df.writeStream.trigger(...)
.outputMode(...)
.start()
如何为结构化流获取相似的时间(最小批量时间)数据,使其能够以相同的方式使用它?
答案 0 :(得分:2)
我搜索了一个函数,该函数可以获取batchTime,但它在Spark结构化流API中似乎还不存在。
这是我用来使用foreachBatch
获取批处理时间(让我们假设批处理间隔为2000毫秒)的解决方法,它使我们可以获取batchId:
val now = java.time.Instant.now
val batchInterval = 2000
df.writeStream.trigger(Trigger.ProcessingTime(batchInterval))
.foreachBatch({ (batchDF: DataFrame, batchId: Long) =>
println(now.plusMillis(batchId * batchInterval.milliseconds))
})
.outputMode(...)
.start()
以下是输出:
2019-07-29T17:13:19.880Z
2019-07-29T17:13:21.880Z
2019-07-29T17:13:23.880Z
2019-07-29T17:13:25.880Z
2019-07-29T17:13:27.880Z
2019-07-29T17:13:29.880Z
2019-07-29T17:13:31.880Z
2019-07-29T17:13:33.880Z
2019-07-29T17:13:35.880Z
希望对您有帮助!