何时加水印会丢弃最新数据?

时间:2019-01-23 17:54:20

标签: apache-spark spark-structured-streaming

这是我用来测试水印的简单代码:

spark.readStream
  .textFile("C:\\Users\\Pavel_Orekhov\\Desktop\\stream")
  .map(_.split(","))
  .map(a => (a(0), a(1), a(2)))
  .toDF("hour", "hashTag", "userId")
  .selectExpr("CAST(hour as TimeStamp)","hashTag", "userId")
  .withWatermark("hour", "1 hour")
  .groupBy(
    window($"hour", "1 hour", "1 hour"),
    $"hashTag",
    $"userId"
  ).count()
  .writeStream
  .outputMode(OutputMode.Update())
  .format("console")
  .start().processAllAvailable()

文件夹stream包含一个具有以下内容的文件:

1994-12-28T09:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T10:03,pavel,123
1994-12-28T10:03,pavel,123
1994-12-28T11:03,pavel,123
1994-12-28T11:03,pavel,123
1994-12-28T09:03,pavel,123
1994-12-28T06:03,pavel,123

我得到的输出是这样:

+--------------------+-------+------+-----+
|              window|hashTag|userId|count|
+--------------------+-------+------+-----+
|[1994-12-28 09:00...|  pavel|   123|    7|
|[1994-12-28 06:00...|  pavel|   123|    1|
|[1994-12-28 11:00...|  pavel|   123|    2|
|[1994-12-28 10:00...|  pavel|   123|    2|
+--------------------+-------+------+-----+

在我阅读的文本文件中,您可以看到有9AM条目和11AM条目之后的6AM条目。我认为这些内容将被删除,因为加水印仅应更新我们在最后一个小时内收到的数据。

那么,为什么不掉线呢?

1 个答案:

答案 0 :(得分:1)

事实证明,这是因为它只是一批,并且其中的数据是无序的。当我创建一个值为1994-12-28T06:03,pavel,123的新文件时,它确实被删除了,因为它是新批处理的一部分。