只能使用Confluent Kafka Connect将简单对象插入数据库。不知道如何使这个支持复杂的json / schema结构。我不确定这个功能是否可用。大约一年前有一个类似的问题here,但直到现在才回答。请帮忙。
答案 0 :(得分:3)
Kafka Connect确实支持复杂的结构,包括Struct
,Map
和Array
。通常只有源连接器需要这样做,因为接收器接收值并且只需要使用它们。 This documentation介绍了构建Schema
对象的基础知识,该对象描述了Struct
,然后创建了遵循该架构的Struct
实例。在这种情况下,示例结构只是一个扁平结构。
但是,您可以轻松添加使用另一个Struct
实例定义的Schema
类型的字段。实际上,它只是将这个简单模式分层到结构中的多个级别:
Schema addressSchema = SchemaBuilder.struct().name(ADDRESS)
.field("number", Schema.INT16_SCHEMA)
.field("street", Schema.STRING_SCHEMA)
.field("city", Schema.STRING_SCHEMA)
.build();
Schema personSchema = SchemaBuilder.struct().name(NAME)
.field("name", Schema.STRING_SCHEMA)
.field("age", Schema.INT8_SCHEMA)
.field("admin", new SchemaBuilder.boolean().defaultValue(false).build())
.field("address", addressSchema)
.build();
Struct addressStruct = new Struct(addressSchema)
.put("number", 100)
.put("street", "Main Street")
.put("city", "Springfield")
.build();
Struct personStruct = new Struct(personSchema)
.put("name", "Barbara Liskov")
.put("age", 75)
.put("address", addressStruct)
.build();
由于SchemaBuilder
是一个流畅的API,您实际上可以像自定义admin
布尔架构构建器一样嵌入它。但这有点困难,因为您需要引用Schema
来创建addressStruct
。
通常,您只需要担心在编写源连接器时如何执行此操作。如果您尝试使用现有的源连接器,您可能几乎无法控制键和值的结构。例如,Confluent's JDBC source connector使用单独的Schema
为每个表建模,并且该表中的每一行都是使用该模式的单独Struct
。但由于行是平的,Schema
和Struct
只包含具有基本类型的字段。
Debezium's MySQL和PostgreSQL的CDC连接器还为Schema
建模关系表,每行对应Struct
个对象,但CDC捕获更多有关行的信息,例如更改之前和/或之后的行的状态。因此,这些连接器对涉及嵌套Struct
对象的每个表使用a more complex Schema
。
请注意,虽然每个源连接器都有自己的消息结构风格,但Kafka Connect的Single Message Transforms (SMTs)可以很容易地对源连接器生成的消息进行过滤,重命名和稍作修改。写入Kafka,或者在将Kafka发送到接收器之前从Kafka读取的消息。