Kafka Connect-JSON转换器-JDBC Sink连接器-列类型JSON

时间:2019-01-22 07:07:58

标签: postgresql jdbc apache-kafka apache-kafka-connect confluent

用例是将整个消息(即JSON)和密钥存储为表中具有两列“ id”和“ data”的记录。

数据库为Postgres,并且支持列类型为JSON。

根据本文,JSONConverter中支持的类型为字符串,int64等 https://cwiki.apache.org/confluence/display/KAFKA/KIP-301%3A+Schema+Inferencing+for+JsonConverter

是否可以将数据字段的类型设置为JSON,然后将其存储在Postgres DB中,其列类型为JSON。

duck

样本数据有效载荷为

schema = `{
"type":"struct",
"fields":[
    {"type":"string", "optional": false, "field":"id"},
    {"type":"string", "optional": false, "field":"data"}
]}`

以上将数据存储为文本,并且期望Postgres中的列为text类型。 如果Postgres上的列的类型为JSON,则JDBC Sink Connector将引发错误。

在Postgres上使用JSON类型将有助于在JSON字段上创建索引,等等。是否可以将JSONConverter与JDBC Sink Converter一起适当地用于存储列类型为JSON的记录。

2 个答案:

答案 0 :(得分:0)

使用value.converter.schema.enable=true,并发送这样的JSON数据(将模式作为每条消息的一部分,并使用实际的消息数据更新payload部分),并且它应与JDBC Sink一起使用。

{
    "schema": {
        "type": "struct",
        "fields": [{
            "type": "int32",
            "optional": false,
            "field": "id"
        }, {
            "type": "struct",
            "name": "data",
            "optional": false,
            "fields": [{
               "type": "string",
               "name": "hello",
               "optional":false
            }]
        }],
        "optional": false,
        "name": "foobar"
    },
    "payload": {
        "id": 10000,
        "data": {"hello":"world"}
    }
}

或者您可以考虑将客户端转换为使用Avro,并节省一些网络带宽。

答案 1 :(得分:0)

JDBC Sink连接器不支持PostgreSQL json,jsonb类型。它支持多种基本类型,日期时间。

在以下页面上,您可以找到映射架构类型到数据库类型(PostgreSQL)https://docs.confluent.io/5.1.0/connect/kafka-connect-jdbc/sink-connector/index.html

尽管JDBC Source (连接器)在某些部分支持json和jsonb类型-这种类型的列将不会映射到STRUCT,但会映射到STRING类型。