1

文档

默认情况下,foreachBatch 仅提供至少一次写入保证。但是,您可以使用提供给函数的 batchId 作为对输出进行重复数据删除并获得完全一次保证的方式。

这是否意味着除非我们加倍努力,否则即使我们在主 writeStream 操作中使用检查点,我们也无法实现一次性写入保证?

如果是,应该怎么做才能实现一次性写入保证?文档中的含义是:

使用 batchId ?

PS:最初的问题是针对 Kafka 的,但我将其概括为解决方案将适用于 foreachBatch 块中的任何内容。

4

1 回答 1

0

这是否意味着除非我们加倍努力,否则即使我们在主 writeStream 操作中使用检查点,我们也无法实现一次性写入保证?

结构化流保证至少一个语义,这意味着每个记录将至少出现一次,即使我们有检查点,也不能保证不会出现重复记录。

如果是,应该怎么做才能实现一次性写入保证?文档中的含义是

根据选择使用的数据接收器,实现恰好一次语义的方式会有所不同。

为了解释起见,让我们将弹性搜索作为数据接收器。我们知道 ES 是一个文档存储,每条记录都有一个唯一的 doc_id。假设我们有一个具有以下架构的数据框 -

|-- count: long (nullable = false)
|-- department: string (nullable = false)
|-- start_time: string (nullable = false)
|-- end_time: string (nullable = false)

在这种情况下,我们将 (department,start_time,end_time) 作为我们的唯一键列,我们可以找到这些列的哈希并将其用作弹性搜索中的 doc_id 列使用index-api

使用这种方式,在重复记录的情况下,它们将被散列到相同的值,并且由于 ES 不允许在特定索引中重复 doc_id,它将使用相同的记录更新文档并增加其版本。

在其他数据接收器中也可以采用类似的方法。

于 2021-06-09T18:32:44.457 回答