带水印的 Spark 结构化流重复数据删除

Spark Structured Streaming Deduplication with Watermark

我想将 Spark Structured Streaming 用于 ETL 作业,其中每个事件的形式为:

{
   "signature": "uuid",
   "timestamp: "2020-01-01 00:00:00",
   "payload": {...}
}

事件最多可以延迟 30 天到达,并且可以包含重复项。我想根据“签名”字段对它们进行重复数据删除。

如果我使用推荐的解决方案:

streamingDf \
  .withWatermark("timestamp", "30 days") \
  .dropDuplicates("signature", "timestamp")
  .write

该跟踪(保存在内存中、存储等)完整事件内容的缓冲区(可能非常大)还是仅跟踪“签名”字段值?

此外,像上面这样的简单查询会在新数据到达时立即写入新事件,还是会“阻塞”30 天?

"would that track (keep in memory, store etc) a buffer of the full event content (which can be quite large) or will it just track the "signature" field values ?"

是的,它将保留 streamingDf 的所有列,而不仅仅是签名和时间戳列。

"Also, would the simple query like the above write new events immediately as new data arrives or would it "block" for 30 days?"

此查询将在新数据到达时立即写入事件,并且只会将状态至少保持 30 天,以便能够识别重复项。


根据我个人使用流应用程序的经验,我确实推荐您的消息去重方法。从操作的角度来看,将状态保持长达 30 天是相当具有挑战性的。请记住,任何小的网络故障、停电、planned/unplanned 维护您的 OS 等都可能导致您的应用程序失败或产生错误的结果。

我强烈建议您通过其他方法删除重复数据,例如将数据写入 Delta Table 或任何其他格式或数据库。