为什么内存接收器在追加模式下什么都不写?

时间:2017-02-28 04:12:59

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

我使用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,那么我可以获得汇总数据。但这不是我的选择,因为要求是使用追加模式。

代码有问题吗? 谢谢,

1 个答案:

答案 0 :(得分:1)

在追加模式下,

  

窗口聚合的输出延迟了withWatermark()

中指定的后期阈值

在你的情况下,延迟是5分钟,我对你的输入数据一无所知,但我想你可能需要等待5分钟。

我建议您阅读(再次?)the docs for Structured Streaming