Jdbc 为什么Kafka Connect会以不同的方式处理时间戳列?

Jdbc 为什么Kafka Connect会以不同的方式处理时间戳列?,jdbc,apache-kafka,db2,apache-kafka-connect,Jdbc,Apache Kafka,Db2,Apache Kafka Connect,我设置了一个Kafka Connect配置,用于从DB2提取数据。我没有使用Avro,只是开箱即用的json。在db中的列中有几个时间戳列,当它们流式传输时,它们显示如下: "Process_start_ts": 1578600031762, "Process_end_ts": 1579268248183, "created_ts": 1579268247984, "updated_ts": { "long": 1579268248182 } } 最后一列是使用此子元素呈现的,尽管其他3列

我设置了一个Kafka Connect配置,用于从DB2提取数据。我没有使用Avro,只是开箱即用的json。在db中的列中有几个时间戳列,当它们流式传输时,它们显示如下:

"Process_start_ts": 1578600031762,
"Process_end_ts": 1579268248183,
"created_ts": 1579268247984,
"updated_ts": {
 "long": 1579268248182
 }
}
最后一列是使用此子元素呈现的,尽管其他3列不是。(这将给消费者带来问题。) 我唯一能看到的是,在DB中,只有该列的默认值为null


有没有什么方法可以强制此列在消息中呈现为前3列

请尝试使用将邮件展平

下面的配置代码段显示了如何使用句点
分隔符字符连接字段名(您必须将这些行添加到连接器配置中):

因此,您的JSON消息应该如下所示:

{
  "Process_start_ts": 1578600031762,
  "Process_end_ts": 1579268248183,
  "created_ts": 1579268247984,
  "updated_ts.long": 1579268248182
}

关于JSON,请参见展平SMT。

我不确定创建的
与前两个有什么不同。值仍然是长的,只有键都是小写。现在还不清楚它是如何知道默认值应该是什么的-您是否正在使用确定您没有使用AvroConverter?如果不是,则不清楚哪些字段会有默认值


更新的时间是这样嵌套的,基于Avro或结构化JSON Kafka Connect规范,该规范规定类型名称作为记录的一部分包含,以明确表示可空字段的类型

更新的时间是Avro可空长的,而不是嵌套的结构我没有为消息指定任何模式。我想卡夫卡连接是从数据推断出来的。顺便说一句,扁平化SMT没有效果。JDBC源连接器创建了模式。记录已经是平的,所以不确定你期望的是什么,我从来没有告诉过你要使用它。对不起,是另一个答案建议了平的。当你说记录已经平平,而不是跟随。该记录仍然包含子元素:“created_ts”:1579268247984,“updated_ts”:{“long”:1579268248182}右。正如我在评论中所说,记录不是嵌套结构。它是一个可为空的长字段,因此该类型是必需的,如Avro规范中所述。如果为
更新的\u ts
删除数据库中的任何空字段,则会有一个“更干净”的架构。否则,它就没有遗传上的问题。您应该使用Avro模式解析器,而不是JSON解析器来处理它
{
  "Process_start_ts": 1578600031762,
  "Process_end_ts": 1579268248183,
  "created_ts": 1579268247984,
  "updated_ts.long": 1579268248182
}