下面是我从卡夫卡读取数据的方式。
val inputDf = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", brokers)
.option("subscribe", topic)
.option("startingOffsets", """{"topic1":{"1":-1}}""")
.load()
val df = inputDf.selectExpr("CAST(value AS STRING)","CAST(topic AS STRING)","CAST (partition AS INT)","CAST (offset AS INT)","CAST (timestamp AS STRING)")
如何从上述数据框中获取最大和最小偏移量和时间戳?我想将其保存到某个外部源以供将来参考。我无法使用“ agg”功能,因为我正在将相同的数据帧写入writestream(如下所示)
val kafkaOutput = df.writeStream
.outputMode("append")
.option("path", "/warehouse/download/data1")
.format("console")
.option("checkpointLocation", checkpoint_loc)
.start()
.awaitTermination()
答案 0 :(得分:0)
如果您可以将Spark版本升级到2.4.0,则可以解决此问题。
在Spark 2.4.0中,您具有spark foreachbatch api,通过它可以将同一DataFrame写入多个接收器。
Spark.writestream.foreachbatch(((batchDF,batchId)=> some_fun(batchDF))。start()
some_fun(batchDF):{保持DF并执行聚合}