我正在学习Confluent平台(Kafka,Ksql等)。我正在使用带有Kafka Connect的Debezium将数据流式传输到Kafka主题中。我的数据库表“ log”中的一个字段称为“ register”,它是添加记录的时间戳。
供参考,表日志的结构(在源MySQL数据库中)如下:
CREATE TABLE `log` (
`code` varchar(9) NOT NULL,
`register` datetime NOT NULL,
`entry` mediumtext NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
我正在使用以下按预期方式运行的配置将两个数据库中“日志”表中的数据流式传输到单个Kafka主题中。
"transforms.topicRoute.type": "org.apache.kafka.connect.transforms.RegexRouter",
"transforms.topicRoute.regex": "([^.]+)\\.([^.]+)\\.([^.]+)",
"transforms.topicRoute.replacement": "merged.$3",
我正在尝试建立一个KSQL流,该流将创建一个新密钥,该密钥是源数据库(来自Debezium生成的元数据)和日志表中的代码字段以及其余字段的串联。表。这样做的目的是使派生键在发送到接收器时是唯一的(当前连接到另一个MySQL数据库,该MySQL数据库包含一个日志表,其内容应该是两个源数据库的日志表的合并副本)
我尝试运行的查询是:
SELECT source->db + '.' + after->code AS KeyValue, after->register, after->entry FROM MERGED_LOG LIMIT 1;
但是会发生以下错误:
line 1:59: mismatched input 'register' expecting {'INTEGER', 'DATE', 'TIME', 'TIMESTAMP', 'INTERVAL', 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 'ZONE', 'PARTITION', 'STRUCT', 'EXPLAIN', 'ANALYZE', 'TYPE', 'SHOW', 'TABLES', 'COLUMNS', 'COLUMN', 'PARTITIONS', 'FUNCTIONS', 'FUNCTION', 'ARRAY', 'MAP', 'SET', 'RESET', 'SESSION', 'IF', IDENTIFIER, DIGIT_IDENTIFIER, QUOTED_IDENTIFIER, BACKQUOTED_IDENTIFIER}
Statement: SELECT source->db + '.' + after->code AS KeyValue, after->register, after->entry FROM MERGED_LOG LIMIT 1;
Caused by: line 1:59: mismatched input 'register' expecting {'INTEGER', 'DATE',
'TIME', 'TIMESTAMP', 'INTERVAL', 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE',
'SECOND', 'ZONE', 'PARTITION', 'STRUCT', 'EXPLAIN', 'ANALYZE', 'TYPE', 'SHOW',
'TABLES', 'COLUMNS', 'COLUMN', 'PARTITIONS', 'FUNCTIONS', 'FUNCTION', 'ARRAY',
'MAP', 'SET', 'RESET', 'SESSION', 'IF', IDENTIFIER, DIGIT_IDENTIFIER,
QUOTED_IDENTIFIER, BACKQUOTED_IDENTIFIER}
Caused by: org.antlr.v4.runtime.InputMismatchException
我看不到任何地方暗示“注册”是某种保留术语。
有人可以帮忙吗?备选方案可以建议任何一种通过转换来更改字段名称的方法,请记住,由于我需要获取源数据库名称,因此我无法展平Debezium生成的消息
答案 0 :(得分:2)
是的REGISTER
是保留字,您应该在DDL中避免使用它。您可以通过引用它来访问它,值得尝试。
有一个用于删除字段的单一消息转换,但不适用于嵌套数据。您可以尝试的是将UnwrapFromEnvelope
SMT结合使用以重命名该字段。我没有尝试过此配置,但类似
"transforms": "unwrap,renameField",
"transforms.unwrap.type": "io.debezium.transforms.UnwrapFromEnvelope",
"transforms.renameField.type": "org.apache.kafka.connect.transforms.ReplaceField$Value",
"transforms.renameField.renames": "register:notareservedword",