简体   繁体   English

如何在 Kafka Connect JDBC Source 连接器中添加显式 WHERE 子句

[英]How to add explicit WHERE clause in Kafka Connect JDBC Source connector

I am using kafka connect to source data from DB2 to kafka topic and i am configuring sql query to read the data from DB2 , below is query我正在使用 kafka 连接从 DB2 到 kafka 主题的源数据,我正在配置 sql 查询以从 DB2 读取数据,下面是查询

SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR WHERE TRAN_I ='503' AND PRCS_N = 'GLOBAL'

am using setting "timestamp.column.name": "CREATE_TS" here problem is in the query their is already WHERE clause , and kafka connect tried to add another where clause with timestamp column and it is creating issue and one more issue is if i remove where clause from sql clause like below我正在使用设置"timestamp.column.name": "CREATE_TS"这里的问题是在查询中,它们已经是WHERE子句,而 kafka connect 尝试添加另一个带有时间戳列的 where 子句,它正在创建问题,还有一个问题是如果我从 sql 子句中删除 where 子句,如下所示

SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR

then am getting error with substr , like below然后出现 substr 错误,如下所示

SQL Error [22011]: THE SECOND OR THIRD ARGUMENT OF THE SUBSTR OR SUBSTRING FUNCTION IS OUT OF RANGE. SQLCODE=-138, SQLSTATE=22011, DRIVER=4.19.26

can anyone suggest on both is this issues , am stuck at this point .任何人都可以就这两个问题提出建议,我在这一点上被困住了。

This happens because you are trying to use both "mode": "timestamp" and query .发生这种情况是因为您尝试同时使用"mode": "timestamp"query TimestampIncrementingTableQuerier appends a WHERE clause to the query that conflicts with existing WHERE clauses in the query . TimestampIncrementingTableQuerierWHERE子句附加到与查询中现有WHERE子句冲突的query

JDBC source connector docs is clear on this: JDBC 源连接器文档对此很清楚:

query

If specified, the query to perform to select new or updated rows.如果指定,则为选择新行或更新行而执行的查询。 Use this setting if you want to join tables, select subsets of columns in a table, or filter data.如果要连接表、选择表中的列子集或过滤数据,请使用此设置。 If used, this connector will only copy data using this query -- whole-table copying will be disabled.如果使用,此连接器将仅使用此查询复制数据——将禁用整表复制。 Different query modes may still be used for incremental updates, but in order to properly construct the incremental query, it must be possible to append a WHERE clause to this query (ie no WHERE clauses may be used).不同的查询模式仍可用于增量更新,但为了正确构造增量查询,必须可以在此查询中附加 WHERE 子句(即不能使用 WHERE 子句)。 If you use a WHERE clause, it must handle incremental queries itself .如果使用 WHERE 子句,它必须自己处理增量查询


As a workaround, you can modify your query to (depending on what SQL flavour are you using)作为一种解决方法,您可以将查询修改为(取决于您使用的 SQL 风格)

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

or或者

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

For example, in your case the query should be例如,在您的情况下,查询应该是

"query":"SELECT * FROM (SELECT SEQ_I AS error_id, TRIM(SEND_I) AS sca , to_char(CREATE_TS,'YYYY-MM-DD HH24:MI:SS.FF3') AS create_timestamp, CREATE_TS, TRIM(ERR_MSG) AS error_message , CASE substr(ERR_MSG,1,locate('-',ERR_MSG)-1) WHEN 'WARNING' THEN 'W' WHEN 'SUSPENDED' THEN 'F' END ERROR_TYPE FROM INTCHG_ERROR_DIR WHERE TRAN_I ='503' AND PRCS_N = 'GLOBAL') o"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM