Scala 为什么流式数据集会因“失败”而失败;当流数据帧/数据集上存在流聚合时,不支持完整输出模式&引用;?

Scala 为什么流式数据集会因“失败”而失败;当流数据帧/数据集上存在流聚合时,不支持完整输出模式&引用;?,scala,apache-spark,spark-structured-streaming,Scala,Apache Spark,Spark Structured Streaming,我使用Spark 2.2.0,在windows上使用Spark结构化流媒体时出现以下错误: 当流式数据帧/数据集上存在流式聚合且没有水印时,不支持完整输出模式 当流数据帧/数据集上存在不带水印的流聚合时,不支持完整输出模式 流式聚合要求您告诉Spark Structured Streaming engine何时输出聚合(按照所谓的输出模式),因为可能是聚合一部分的数据可能会延迟,并且只有在一段时间后才可用 “某个时间”部分是事件延迟,描述为从当前时间开始的水印时间 这就是为什么您必须指定水印,以

我使用Spark 2.2.0,在windows上使用Spark结构化流媒体时出现以下错误:

流式数据帧/数据集
上存在
流式聚合
且没有
水印
时,不支持完整输出模式

当流数据帧/数据集上存在不带水印的流聚合时,不支持完整输出模式

流式聚合要求您告诉Spark Structured Streaming engine何时输出聚合(按照所谓的输出模式),因为可能是聚合一部分的数据可能会延迟,并且只有在一段时间后才可用

“某个时间”部分是事件延迟,描述为从当前时间开始的水印时间

这就是为什么您必须指定水印,以允许Spark drop/忽略任何延迟事件,并停止累积可能最终导致OutOfMemoryError或类似错误的状态

话虽如此,您应该在流数据集上使用operator

withWatermark定义此数据集的事件时间水印。水印跟踪一个时间点,在此时间点之前,我们假设不会有更多的延迟数据到达

并引用

Spark将此水印用于多种用途:

  • 了解何时可以完成给定的时间窗口聚合,从而在使用不允许更新的输出模式时发出聚合
  • 为了最大限度地减少我们需要为正在进行的聚合保留的状态量,mapGroupsWithState和dropDuplicates操作符
当前水印是通过查看查询中所有分区的最大值(eventTime)减去用户指定的延迟阈值来计算的。由于跨分区协调此值的成本,所使用的实际水印仅保证在实际事件时间之后至少延迟阈值。在某些情况下,我们可能仍然会处理延迟到达的记录

查看Spark Structured Streaming的