如何使结构化流中的dropDuplicates状态到期以避免OOM?

Kev*_*vin 4 out-of-memory duplicates apache-spark apache-spark-sql spark-structured-streaming

我想使用spark结构流来计算每天的唯一访问权限,因此我使用以下代码

.dropDuplicates("uuid")
Run Code Online (Sandbox Code Playgroud)

并且在第二天应该删除今天保持的状态,以便我可以获得第二天的唯一访问权限并避免OOM.spark文件表示使用带水印的dropDuplicates,例如:

.withWatermark("timestamp", "1 day")
.dropDuplicates("uuid", "timestamp")
Run Code Online (Sandbox Code Playgroud)

但必须在dropDuplicates中指定水印列.在这种情况下,uuid和timestamp将被用作组合键,以使用相同的uuid和timestamp对元素进行重复数据删除,这不是我所期望的.

那么有一个完美的解决方案吗?

Kev*_*vin 6

经过几天的努力,我终于找到了自己的方式.

在研究水印dropDuplicates的源代码时,我发现除了eventTime列之外,水印还支持window列,因此我们可以使用以下代码:

.select(
    window($"timestamp", "1 day"),
    $"timestamp",
    $"uuid"
  )
.withWatermark("window", "1 day")
.dropDuplicates("uuid", "window")
Run Code Online (Sandbox Code Playgroud)

由于同一天的所有事件都具有相同的窗口,因此这将产生与仅使用uuid进行重复数据删除相同的结果.希望可以帮助某人.