Apache kafka 嵌套JSON中的DataStax Apache Kafka连接器UDT字段问题

Apache kafka 嵌套JSON中的DataStax Apache Kafka连接器UDT字段问题,apache-kafka,cassandra,mapping,datastax,user-defined-types,Apache Kafka,Cassandra,Mapping,Datastax,User Defined Types,无法读取JSON主题以写入具有UDT类型列的cassandra表。(我在我的主题和表格上有很多列,所以我使用了UDT类型的列)低于警告,并且展平转换没有帮助,也没有转换。从映射连接器中删除value.call.onnet [2020-12-08 00:17:12,415] WARN Error decoding/mapping Kafka record SinkRecord{kafkaOffset=358, timestampType=CreateTime} ConnectRecord{topi

无法读取JSON主题以写入具有UDT类型列的cassandra表。(我在我的主题和表格上有很多列,所以我使用了UDT类型的列)低于警告,并且展平转换没有帮助,也没有转换。从映射连接器中删除
value.call.onnet

[2020-12-08 00:17:12,415] WARN Error decoding/mapping Kafka record SinkRecord{kafkaOffset=358, timestampType=CreateTime} ConnectRecord{topic='account_usage', kafkaPartition=0, key={"number":943821834,"usageDate":20201108}, keySchema=Schema{STRING}, value={"startTime":20201108001019,"endTime":20201108160902,"count":142,"call": { "onnet": { "volume": 3, "unit": "SECOND", "amount": 12.5 }, "offnet": { "volume": 1, "unit": "SECOND", "amount": 2.0 } }, "message": { "roaming": { "volume": 1, "unit": "MSG", "amount": 1.5 }, "local": { "volume": 12, "unit": "MSG", "amount": 3.0 } }, valueSchema=Schema{STRING}, timestamp=1607370857363, headers=ConnectHeaders(headers=)}: Required field 'value.call.onnet' (mapped to column onnet) was missing from record (or may refer to an invalid function). Please remove it from the mapping. (com.datastax.oss.kafka.sink.CassandraSinkTask)
卡夫卡主题示例-帐户使用

{
“编号”:943821834,
“使用日期”:20201108
}

{
“开始时间”:20201108001019,
“结束时间”:20201108160902,
“计数”:142,
“呼叫”:{
“onnet”:{
“卷”:3,
“单位”:“秒”,
“金额”:12.5
},
“offnet”:{
"卷":一,,
“单位”:“秒”,
“金额”:2.0
}
},
“信息”:{
“漫游”:{
"卷":一,,
“单位”:“味精”,
“金额”:1.5
},
“本地”:{
“卷”:12,
“单位”:“味精”,
“金额”:3.0
}
}
}
Cassandra UDT(用户定义类型)定义
创建类型ks\u用法。用法\u类型(
体积比,
金额小数
);
卡桑德拉表定义
创建表ks\u usage.usage\u调用
(
数字bigint,
使用日期int,
输入日期时间uUID,
onnet使用类型,
offnet使用类型,
主键(编号、使用日期)
)
使用群集排序方式(用法\日期描述)
连接器映射
POST/connectors HTTP/1.1
主机:localhost:8083
内容类型:application/json
内容长度:568
{
“名称”:“使用接收器”,
“配置”:{
“connector.class”:“com.datastax.oss.kafka.sink.CassandraSinkConnector”,
“tasks.max”:“1”,
“主题”:“账户使用情况”,
“接触点”:“10.0.153.27”,
“loadBalancing.localDc”:“datacenter1”,
“端口”:9042,
“身份验证提供程序”:“普通”,
“auth.username”:“testusr”,
“验证密码”:“测试”,
“topic.account\u usage.ks\u usage.usage\u call.mapping:“number=key.number,usage\u date=key.usageDate,entry\u date=now(),onnet=value.call.onnet,offnet=value.call.offnet”
}
}
连接器配置-connect-distributed.properties
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
#key.converter=org.apache.kafka.connect.storage.StringConverter
#value.converter=org.apache.kafka.connect.storage.StringConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
变换=展平
transforms.flatte.type=org.apache.kafka.connect.transforms.flatte$Value
transforms.flatte.delimiter=。

谢谢您的详细描述。我正在调试您的问题,而Connect似乎没有检查(传播)内部字段。 发送到Kafka连接器的记录包含以下字段:

value.count, key.usageDate, value.endTime, value.startTime, value.call, value.message, key.number
您可能会注意到,有一个
call
字段,但没有像
onnet
offnet
这样的内部字段。 由于这一事实,没有什么可以抹平的。这些字段不存在,因此无法展平。要解决您的问题,您可以考虑:

  • onnet
    offnet
    移动一个级别,并删除呼叫值。如果这样做,记录将包含
    value.onnet
    value.offnet
    。您将能够使用
    ks\u用法。用法类型

  • 创建一个包含
    onnet
    offnet
    调用
    UDT。这样,您将有一个C*列,其中包含所有
    call
    值。接下来,在映射中,您可以执行
    onnet=value.call


  • 非常感谢您的详细描述。我正在调试您的问题,而Connect似乎没有检查(传播)内部字段。 发送到Kafka连接器的记录包含以下字段:

    value.count, key.usageDate, value.endTime, value.startTime, value.call, value.message, key.number
    
    您可能会注意到,有一个
    call
    字段,但没有像
    onnet
    offnet
    这样的内部字段。 由于这一事实,没有什么可以抹平的。这些字段不存在,因此无法展平。要解决您的问题,您可以考虑:

  • onnet
    offnet
    移动一个级别,并删除呼叫值。如果这样做,记录将包含
    value.onnet
    value.offnet
    。您将能够使用
    ks\u用法。用法类型

  • 创建一个包含
    onnet
    offnet
    调用
    UDT。这样,您将有一个C*列,其中包含所有
    call
    值。接下来,在映射中,您可以执行
    onnet=value.call


  • 我不明白为什么不能被压扁?对于第一种方法,我有另一个表,我必须加以区分,可以是
    call_onnet:{},call_offnet:{}
    等。我也可以用
    onnet\u volume:bigint,onnet\u amount:decimal
    等替换UDT列。但是我有很多列,列数增加了2倍。在C*中添加一列并没有问题。C*设计用于具有大量列的表。扁平化在您的情况下不起作用,因为您使用的JSON没有任何模式作为交换格式。JSON不携带任何关于其结构的信息,而Flatte也看不到这些内部字段。您可以尝试使用Avro作为卡夫卡事件的模式。这种格式有模式,所以它包含更多关于数据结构的信息。我不明白为什么不能展平?对于第一种方法,我有另一个表,我必须加以区分,可以是
    call_onnet:{},call_offnet:{}
    等。我也可以用
    onnet\u volume:bigint,onnet\u amount:decimal
    等替换UDT列。但是我有很多列,列数增加了2倍。在C*中添加一列并没有问题。C*设计用于具有大量列的表。压扁不起作用了,我