我们如何从结构化流中获得最小批量时间

时间:2019-07-29 15:18:38

标签: scala spark-streaming spark-structured-streaming

在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()

如何为结构化流获取相似的时间(最小批量时间)数据,使其能够以相同的方式使用它?

1 个答案:

答案 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

希望对您有帮助!