融合的Kafka Connect支持复杂或嵌套的json / schema

时间:2017-06-20 10:01:06

标签: apache-kafka apache-kafka-connect

只能使用Confluent Kafka Connect将简单对象插入数据库。不知道如何使这个支持复杂的json / schema结构。我不确定这个功能是否可用。大约一年前有一个类似的问题here,但直到现在才回答。请帮忙。

1 个答案:

答案 0 :(得分:3)

Kafka Connect确实支持复杂的结构,包括StructMapArray。通常只有源连接器需要这样做,因为接收器接收值并且只需要使用它们。 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。但由于行是平的,SchemaStruct只包含具有基本类型的字段。

Debezium's MySQLPostgreSQL的CDC连接器还为Schema建模关系表,每行对应Struct个对象,但CDC捕获更多有关行的信息,例如更改之前和/或之后的行的状态。因此,这些连接器对涉及嵌套Struct对象的每个表使用a more complex Schema

请注意,虽然每个源连接器都有自己的消息结构风格,但Kafka Connect的Single Message Transforms (SMTs)可以很容易地对源连接器生成的消息进行过滤,重命名和稍作修改。写入Kafka,或者在将Kafka发送到接收器之前从Kafka读取的消息。