是在Ksql中“注册”保留关键字吗?如果是,如何选择具有该名称的字段

时间:2019-05-14 14:01:43

标签: apache-kafka apache-kafka-connect ksql debezium

我正在学习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生成的消息

1 个答案:

答案 0 :(得分:2)

  1. 是的REGISTER是保留字,您应该在DDL中避免使用它。您可以通过引用它来访问它,值得尝试。

  2. 有一个用于删除字段的单一消息转换,但不适用于嵌套数据。您可以尝试的是将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",