JDBC Teradata接收器:如何插入空值

JDBC Teradata接收器:如何插入空值,jdbc,apache-kafka,teradata,apache-kafka-connect,Jdbc,Apache Kafka,Teradata,Apache Kafka Connect,我正在尝试将数据从卡夫卡插入到Teradata。有效负载有一些空值,JDBC接收器抛出以下错误 [Teradata JDBC Driver] [TeraJDBC 16.20.00.10] [Error 1063] [SQLState HY000] null is not supported as a data value with this variant of the setObject method; use the setNull method or the setObject metho

我正在尝试将数据从卡夫卡插入到Teradata。有效负载有一些空值,JDBC接收器抛出以下错误

[Teradata JDBC Driver] [TeraJDBC 16.20.00.10] [Error 1063] [SQLState HY000] null is not supported as a data value with this variant of the setObject method; use the setNull method or the setObject method with a targetSqlType parameter
我的连接器配置:

name=teradata-sink-K_C_OSUSR_DGL_DFORM_I1-V2
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
connection.url=connectionString
topics=POPS-P-OSUSR_DGL_DFORM_I1-J-V2-CAL-OUT
topic.prefix=
table.name.format=K_C_OSUSR_DGL_DFORM_I1_V2
batch.size=50000
errors.tolerance=all
errors.deadletterqueue.topic.name=POPS-P-OSUSR_DGL_DFORM_I1-V2-CAL-DEAD
errors.deadletterqueue.topic.replication.factor=1

有没有办法做到这一点?我不知道是否必须将某些代码更改为接收器,或者只是更改连接器配置。

您从某行中得到的错误肯定如下所示:

ps.setObject(1,val)

如果您尝试插入的
val
具有
null
值,则此函数将引发异常

错误告诉您必须指定传入空值的数据类型。您可以这样做:

ps.setObject(1, val, Types.VARCHAR); 
这样,您就可以将
NULL
强制转换为
VARCHAR
,这是受支持的
targetSqlTypes
之一

出于同样目的的另一种选择:

ps.setNull(1, Types.VARCHAR) ;

我们的问题是,我们正在使用标准的Kafka Connect创建一个接收器(我们没有编写任何自定义连接器)

我们已经为worker和connector配置了.properties文件,以在主题和teradata表之间创建链接,并使用

.../confluent/bin/connect-standalone <worker.cfg> <connector.cfg>
../confluent/bin/connect standalone

当我们创建一条带有“null”值的消息并将其发送到主题中时,接收器连接器无法将记录插入TD表。

因此我需要更改JDBC Kafka接收器中的那一行?我确实不知道从未使用过的接收器的详细信息,但我想你应该这样做。这里还有更多的信息,以及实现这一点的另一种方法:接收器连接器使用JDBC。这里的答案取决于源消息是否与目标模式匹配。如果是这样,那么Teradata连接器应该有一个新的方言()专门处理数据转换问题。如果模式不匹配,那么对齐它们应该可以工作,不需要任何实际的代码更改。您使用的是什么卡夫卡版本?另外,您可以共享连接器的配置吗?@giorgosmyriantous done,我认为版本是3.2.2您的目标模式是什么?您的源消息是什么样子的?