canal-adapter:配置后,增量和全量还是没有同步且报错support -sqlRs has error
(单表同步没有问题,关联表没有同步)
ERROR com.alibaba.otter.canal.client.adapter.support.U til - sqlRs has errorERROR c.a.otter.canal.client.adapter.es7x.etl.ESEtlSer vice - java.lang.RuntimeException: java.lang.NullPointerException
具体原因,虽然sql写法没有问题,但是需要满足aliyun的canal的sql规则:
sql映射说明:sql支持多表关联自由组合, 但是有一定的限制:1.主表不能为子查询语句2.只能使用left outer join即最左表一定要是主表3.关联从表如果是子查询不能有多张表4.主sql中不能有where查询条件(从表子查询中可以有where条件但是不推荐, 可能会造成数据同步的不一致, 比如修改了where条件中的字段内容)5.关联条件只允许主外键的'='操作不能出现其他常量判断比如: on a.role_id=b.id and b.statues=16.关联条件必须要有一个字段出现在主查询语句中比如: on a.role_id=b.id 其中的 a.role_id 或者 b.id 必须出现在主select语句中
提示:必须要满足以上六中规则才可以实现同步增量|全量
例如:正确关联表同步配置
select a.id as _id, a.name, a.role_id, b.role_name, a.c_time from user a left join role b on b.id = a.role_id
注:这里join操作只能是left outer join, 第一张表必须为主表!!
关联条件必须要有一个字段出现在主查询语句中比如: b.id = a.role_id 其中的 a.role_id 或者 b.id 必须出现在主select语句中
该sql对应的es mapping示例:
{ "mytest_user": { "mappings": { "_doc": { "properties": { "name": { "type": "text" }, "role_id": { //这个关联条件必须要有 "type": "long" }, "role_name": { "type": "text" }, "c_time": { "type": "date" } } } } }}