alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.55k stars 7.62k forks source link

cannot write xcontent for unknown value of type class java.sql.Timestamp #3017

Open gangade opened 4 years ago

gangade commented 4 years ago

environment canal 1.1.5-SNAPSHOT mysql 5.6.49 es 7.6.2 Issue Description mysql5.6.49一个表中有两个字段,类型为timestamp,es对应的mapping为date,然后启动canal-adapter,etl同步(curl http://127.0.0.1:8081/etl/es7/mytest_article1.yml -X POST)数据时报 java.lang.RuntimeException: java.lang.IllegalArgumentException: cannot write xcontent for unknown value of type class java.sql.Timestamp,这个问题如何解决呢? 如果把mysql和es里的这个字段删除,canal-adapter同步是没有问题. new 5.txt

If there is an exception, please attach the exception trace:

kingberQ commented 4 years ago

应该是你的ES的字段名和mysql的字段名不一样

gangade commented 4 years ago

应该是你的ES的字段名和mysql的字段名不一样

这个解决了。是我es创建索引的时候,日期字段按照date创建后,查看mapping成了text的。

vantis-zh commented 4 years ago

我碰到了同样的问题 实际上我没有手动创建mapping 之后我尝试手动指定为date之后 依然报这个错

51yourdream commented 3 years ago

bug复现步骤:

  1. es中创建好mapping 此事es中没有任何数据
  2. 同步mysql数据到es,如果数据库中有timestamp类型的字段,会报cannot write xcontent for unknown value of type class java.sql.Timestamp

bug的原因是 如果es为空 在获取es mapping的时候 拿不到各个字段的数据类型 解决方案:

  1. 方法一:es创建好mapping后 手动add一条数据,后续在添加数据的时候就可以获取到个字段的数据类型
  2. 方法二:需要修改源码,大体思路是当es获取到field type=null的时候走自己配置的字段类型 以上两个方法都可行
Shuk3 commented 5 months ago

应该是你的ES的字段名和mysql的字段名不一样

这个解决了。是我es创建索引的时候,日期字段按照date创建后,查看mapping成了text的。 我也遇到了,是要重建整个索引吗,还是有其他的办法