我使用Spark的结构化流媒体来传播来自Kafka的消息。然后聚合数据,并使用追加模式写入内存接收器。但是,当我试图查询内存时,它什么也没有返回。以下是代码:
result = model
.withColumn("timeStamp", col("startTimeStamp").cast("timestamp"))
.withWatermark("timeStamp", "5 minutes")
.groupBy(window(col("timeStamp"), "5 minutes").alias("window"))
.agg(
count("*").alias("total")
);
// writing to memory
StreamingQuery query = result.writeStream()
.outputMode(OutputMode.Append())
.queryName("datatable")
.format("memory")
.start();
// query data in memory
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
sparkSession.sql("SELECT * FROM datatable").show();
}
}, 10000, 10000);
结果总是:
|window|total|
+------+-----+
+------+-----+
如果我使用outputMode = complete
,那么我可以获得汇总数据。但这不是我的选择,因为要求是使用追加模式。
代码有问题吗? 谢谢,
答案 0 :(得分:1)
在追加模式下,
窗口聚合的输出延迟了
中指定的后期阈值withWatermark()
在你的情况下,延迟是5分钟,我对你的输入数据一无所知,但我想你可能需要等待5分钟。
我建议您阅读(再次?)the docs for Structured Streaming: