Apache flink 在向upsert kafka s发送消息之前写入更新_

Apache flink 在向upsert kafka s发送消息之前写入更新_,apache-flink,Apache Flink,我在家看书 它说: 作为接收器,upsert kafka连接器可以使用changelog流。 它将在数据之后写入INSERT/UPDATE_作为正常的卡夫卡消息值, 并将删除数据写入带有空值的Kafka消息(指示 钥匙的墓碑) 它并没有提到,若在信息写入upsert kafka之前更新_,那个么会发生什么 在同一链接()中,文档提供了一个完整的示例: INSERT INTO pageviews_per_region SELECT user_region, COUNT(*), COUN

我在家看书

它说:

作为接收器,upsert kafka连接器可以使用changelog流。 它将在数据之后写入INSERT/UPDATE_作为正常的卡夫卡消息值, 并将删除数据写入带有空值的Kafka消息(指示 钥匙的墓碑)

它并没有提到,若在信息写入upsert kafka之前更新_,那个么会发生什么

在同一链接()中,文档提供了一个完整的示例:

INSERT INTO pageviews_per_region
SELECT
  user_region,
  COUNT(*),
  COUNT(DISTINCT user_id)
FROM pageviews
GROUP BY user_region;

通过上面的插入/选择操作,生成消息后插入/更新\u之前/更新\u并将其转到upsert kafka接收器,我将询问upsert kafka遇到更新\u之前消息时会发生什么情况。

来自源代码上的注释

        / /   partial code
        // During the Upsert mode during the serialization process, if the operation is executed is Rowkind.delete or Rowkind.Update_before                 
        // set it to NULL (corresponding to Kafka tomb news)

Upsert kafka sink不要求计划者在发送消息之前发送UPDATE_(在某些情况下,计划者仍可能在发送消息之前发送UPDATE_),并将在消息之后写入INSERT/UPDATE_作为带有关键部分的普通kafka记录,并将删除消息写入带有空值的kafka记录(指示密钥的墓碑)。Flink将通过主键列值上的分区数据来保证主键上的消息顺序

Upsert kafka源是一种变更日志源。changelog源上的主键语义意味着具体化的变更日志(INSERT/UPDATE\u BEFORE/UPDATE\u AFTER/DELETE)在主键约束上是唯一的。Flink假定主键上的所有消息都是有序的

实施细节
由于upsert,卡夫卡连接器仅生成upsert流,其中不包含UPDATE_BEFORE消息。但是,一些操作需要在正确处理消息之前进行更新,例如聚合。因此,我们需要一个物理节点来具体化upsert流并生成带有完整更改消息的changelog流。在物理操作符中,我们将使用state来知道密钥是否是第一次看到的。操作员将生成插入行,或者为上一个图像在行之前生成更新,或者生成所有列都填充了值的删除行。

感谢@ran lupovich提供的有用答案。哪个类的源代码包含注释:
在序列化过程中的Upsert模式期间
好的,谢谢@ran lupovich。我在卡夫卡德辛找到了它