汇合:错误无法对表TimestampIncrementingTableQuerier mysql-jdbc运行查询

时间:2018-11-29 12:12:30

标签: jdbc apache-kafka apache-kafka-connect confluent confluent-schema-registry

我正在尝试在MySQL中使用模式时间戳,因为表大小为2.6 GB,所以行数有限。

这是我正在使用的连接器属性:

{
        "name": "jdbc_source_mysql_registration_query",
        "config": {
                 "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
                 "key.converter": "io.confluent.connect.avro.AvroConverter",
                 "key.converter.schema.registry.url": "http://localhost:8081",
                 "value.converter": "io.confluent.connect.avro.AvroConverter",
                 "value.converter.schema.registry.url": "http://localhost:8081",
                 "connection.url": "jdbc:mysql://localhost:3310/users?zeroDateTimeBehavior=ROUND&useCursorFetch=true&defaultFetchSize=1000&user=kotesh&password=kotesh",
                 "query": "SELECT matriid,DateUpdated  from users.employee WHERE date(DateUpdated)>='2018-11-28' ",
                 "mode": "timestamp",
                 "timestamp.column.name": "DateUpdated",
                 "validate.non.null": "false",
                 "topic.prefix": "mysql-prod-kot-"
        }
}

我得到如下信息:

  

INFO TimestampIncrementingTableQuerier {table = null,query ='SELECT   matriid,Date从users.employee WHERE更新   date(DateUpdated)> ='2018-11-28'',topicPrefix ='mysql-prod-kot-',   crementingColumn =“,timestampColumns = [DateUpdated]}准备了SQL   查询:SELECT matriid,DateUpdates from users.employee WHERE   date(DateUpdated)> ='2018-11-28'DateUpdated在哪里?和   DateUpdated <吗?按DateUpdated ASC排序   (io.confluent.connect.jdbc.source.TimestampIncrementingTableQuerier:161)       [2018-11-29 17:29:00,981]错误无法运行表TimestampIncrementingTableQuerier {table = null,query ='SELECT   matriid,Date从users.employee WHERE更新   date(DateUpdated)> ='2018-11-28'',topicPrefix ='mysql-prod-kot-',   incrementingColumn =“,timestampColumns = [DateUpdated]}:{}   (io.confluent.connect.jdbc.source.JdbcSourceTask:328)       java.sql.SQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册   在'WHERE DateUpdated>'1970-01-01附近使用的正确语法   00:00:00.0'和DateUpdated <'2018-11-29 17'在第1行

2 个答案:

答案 0 :(得分:1)

错误如下所示:

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near 
'WHERE `DateUpdated` > '1970-01-01 00:00:00.0' AND `DateUpdated` < '2018-11-29 17' at line 1

这是因为您同时使用query"mode": "timestamp",因此当您在查询中还指定了一个子句时,连接器会尝试附加它自己的WHERE子句,从而导致无效的SQL

对于JDBC源连接器,每个docs

  

为了正确地构造增量查询,必须有可能在此查询后附加WHERE子句(即不得使用WHERE子句)。如果使用WHERE子句,则它本身必须处理增量查询。

答案 1 :(得分:0)

发生这种情况是因为您尝试同时使用"mode": "timestamp"queryTimestampIncrementingTableQuerierWHERE子句附加到与WHERE中现有的query子句冲突的查询中。

JDBC source connector docs很清楚:

  

query

     

如果指定,则执行查询以选择新的或更新的行。采用   此设置(如果要联接表),请选择   表格或过滤数据。如果使用,此连接器将仅复制数据   使用此查询-将禁用整个表复制。不同   查询模式可能仍用于增量更新,但为了   正确构造增量查询,必须有可能   将WHERE子句附加到此查询(即,不得将WHERE子句   用过的)。 如果使用WHERE子句,则它必须处理增量查询   本身

作为一种解决方法,您可以将查询修改为(取决于您使用的是哪种SQL风格)

SELECT * FROM ( SELECT * FROM table WHERE ...)

WITH a AS
   SELECT * FROM b
    WHERE ...
SELECT * FROM a

例如,在您的情况下,查询应为

"query":"SELECT * FROM (SELECT matriid,DateUpdated  from users.employee WHERE date(DateUpdated)>='2018-11-28') o"