3

我想用火花结构流计算每一天的唯一的访问,所以我用下面的代码如何在结构化流媒体中过期dropDuplicates状态以避免OOM?

.dropDuplicates("uuid")

,并在第二天的状态保持今天应该被丢弃,这样我可以得到第二天唯一访问的权利数量并避免OOM。该火花文档指示使用带有水印的dropDuplicates,例如:

.withWatermark("timestamp", "1 day") 
.dropDuplicates("uuid", "timestamp") 

但水印列必须在dropDuplicates中指定。在这种情况下,uuid和timestamp将被用作组合键,以重复删除具有相同uuid和时间戳的元素,这不是我所期望的。

那么有没有完美的解决方案?

回答

3

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

在学习水印dropDuplicates的源代码,我发现,除了一个EVENTTIME列,水印还支持窗口列,所以我们可以使用下面的代码:

.select(
    window($"timestamp", "1 day"), 
    $"timestamp", 
    $"uuid" 
) 
.withWatermark("window", "1 day") 
.dropDuplicates("uuid", "window") 

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