我想使用Spark结构化的流计算每天的唯一访问量,因此我使用以下代码

.dropDuplicates("uuid")

而在第二天,应该保留今天的状态,这样我就可以正确计算第二天的唯一访问次数,并避免OOM。 spark文档指示使用带有水印的dropDuplicates,例如:

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

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

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

最佳答案

经过几天的努力,我终于找到了解决方法。

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

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

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

关于apache-spark - 如何在结构化流中使dropDuplicates的状态到期以避免OOM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45474270/

10-12 22:58