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对元素进行重复数据删除,这不是我所期望的.
那么有一个完美的解决方案吗?
经过几天的努力,我终于找到了自己的方式.
在研究水印和dropDuplicates的源代码时,我发现除了eventTime列之外,水印还支持window列,因此我们可以使用以下代码:
.select(
window($"timestamp", "1 day"),
$"timestamp",
$"uuid"
)
.withWatermark("window", "1 day")
.dropDuplicates("uuid", "window")
Run Code Online (Sandbox Code Playgroud)
由于同一天的所有事件都具有相同的窗口,因此这将产生与仅使用uuid进行重复数据删除相同的结果.希望可以帮助某人.
| 归档时间: |
|
| 查看次数: |
1008 次 |
| 最近记录: |