我遇到一个问题:
MemoryTableMeta过程中,遭遇了parse faield,表用了JSON类型、GENERATED计算列; 希望能通过解析,或者有其他自动跳过的方式吗? 我尝试了忽略ddl,但是看起来还是需要先通过表结构解析缓存的。
canal版本:1.1.2 表结构如下:
CREATE TABLE table01 ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', for_type tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '', for_id bigint(20) NOT NULL DEFAULT '0' COMMENT '', index_date int(10) NOT NULL DEFAULT '0' COMMENT '', index_minute int(4) unsigned zerofill NOT NULL DEFAULT '0000' COMMENT '', detail json NOT NULL COMMENT '统计信息 ', created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, sum_order int(11) GENERATED ALWAYS AS (json_extract(detail, '$.sum_total')) VIRTUAL, finish_order int(11) GENERATED ALWAYS AS (json_extract(detail, '$.sum_finished')) VIRTUAL, rate_timeliness int(11) GENERATED ALWAYS AS (json_extract(detail, '$.rate_timeliness')) VIRTUAL, unfinish_order int(11) GENERATED ALWAYS AS (json_extract(detail, '$.sum_unfinished')) VIRTUAL, count_is_timeliness int(11) GENERATED ALWAYS AS (json_extract(detail, '$.count_is_timeliness')) VIRTUAL COMMENT '', count_total int(11) GENERATED ALWAYS AS (json_extract(detail, '$.count_total')) VIRTUAL COMMENT '', cancel_order int(11) NOT NULL DEFAULT '0' COMMENT '', sum_wait_grap int(11) GENERATED ALWAYS AS (json_extract(detail, '$.sum_wait_grap')) VIRTUAL, sum_wait_distributing int(11) GENERATED ALWAYS AS (json_extract(detail, '$.sum_wait_distributing')) VIRTUAL, PRIMARY KEY (id), KEY day_minute (index_date, index_minute), KEY type_id (for_type, for_id), KEY for_time_id (for_id, index_date, index_minute) ) ENGINE = InnoDB AUTO_INCREMENT = 1147683045 DEFAULT CHARSET = utf8 COMMENT = '实时指标'
原提问者GitHub用户BigChaoChao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Canal 在解析表结构时,需要根据 MySQL 数据类型来进行解析。对于 JSON 类型和 GENERATED 计算列,Canal 目前支持的解析能力有限,可能会出现解析失败的情况。
对于这种情况,建议使用 Canal 的 filter 插件进行数据过滤和转换,通过编写自定义的 Filter 实现对数据的解析和转换,使得数据能够被正确地发送到下游。具体来说,可以在 Filter 中使用 JSON 函数解析 JSON 类型的数据,并将 GENERATED 计算列的值计算出来。
需要注意的是,在使用 filter 插件时,可能需要对解析出的数据进行合并,使得每个数据记录中包含所有需要的数据,从而方便后续处理。同时,在使用 filter 插件时,也需要注意性能问题,避免因为数据量过大导致处理速度变慢。