这是否意味着除非我们加倍努力,否则即使我们在主 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,它将使用相同的记录更新文档并增加其版本。
在其他数据接收器中也可以采用类似的方法。