首页 > 解决方案 > 带有 OutputMode.Complete 的 Spark 结构化流式水印

问题描述

我编写了简单的查询,它应该忽略创建的数据 < 最后一个事件时间 - 5 秒。但是这个查询不起作用。所有数据都打印出来。

我也尝试使用窗口功能window($"created", "10 seconds", "10 seconds"),但这没有帮助。

val inputStream = new MemoryStream[(Timestamp, String)](1, spark.sqlContext)

val df = inputStream.toDS().toDF("created", "animal")

val query = df
  .withWatermark("created", "5 seconds")
  .groupBy($"animal")
  .count()
  .writeStream
  .format("console")
  .outputMode(OutputMode.Complete())
  .start()

标签: apache-sparkapache-spark-sqlspark-streamingspark-structured-streaming

解决方案


您需要更多按信息分组,如下所示:

val windowedCounts = words
    .withWatermark("timestamp", "10 minutes")
    .groupBy(
        window($"timestamp", "10 minutes", "5 minutes"),
        $"word")
    .count()

此外,从手册中:

输出模式必须是追加或更新。完整模式需要保留所有聚合数据,因此不能使用水印删除中间状态。


推荐阅读