繁体   English   中英

kafka-connect-elasticsearch:当使用“write.method”作为 upsert 时,是否可以在 kafka 主题上使用相同的 AVRO object 来发送部分文档?

[英]kafka-connect-elasticsearch: When using “write.method” as upsert, is it possible to use same AVRO object on kafka topic to send partial document?

我正在尝试对 Elasticsearch (ES) kafka 连接器使用“write.method”upsert。 从我的 kafka 流应用程序中,我正在编写我想要 upsert 的文档,关于 ES 连接器配置为从中读取的 kafka 主题。 我在这个主题上使用 avro 对象作为 kafka 值。 我的文档的 AVRO 定义如下所示:

{
  "type": "record",
  "name": "Document",
  "fields": [
    {
      "name": "id",
      "type": ["null", "string"],
    },
    {
      "name": "name",
      "type": ["null", "string"]
    },
    {
      "name": "address",
      "type": ["null", "string"]
    }
  ]
}

该文档有时仅包含 ID 和名称,有时仅包含地址。 当我只发送地址时,id 和 name 会被覆盖,反之亦然。 我已将behavior.on.null.values设置为ignore ,希望 ES 连接器会忽略 null id 和 name 值,但这不能按预期工作。

虽然当我在我的 kafka 主题上使用两个不同的 AVRO 对象时,第一个只包含 id 和 name,另一个只包含地址,但 upsert 模式的行为符合预期。 但是对于同一个kafka主题允许多个AVRO object定义,我需要将主题的兼容模式设置为NONE,这并不理想。

解决手头问题的正确方法是什么?

设置behavior.on.null.values = ignore只是告诉连接器,如果它收到一条消息,其中整个消息是 null,则忽略该消息(其他选项是失败,或者删除 Z45E23A1694652AAFDZ5CE80DA 中匹配的目标文档具有 null 值的消息的密钥,即墓碑消息)。

连接器不支持您描述的部分更新行为。 它可以插入/更新/删除,但只能插入整个文档

如果您想要部分 upsert 行为,那么您需要自己实现这一点,无论是在自定义连接器中,还是通过将 state 存储在您的 Kafka Streams 应用程序中,以便能够在每次增量通过时发出完整的记录。

write.method=upsert可以进行部分更新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM