现象
同步数据异常
Caused by: java.lang.IllegalArgumentException: cannot write xcontent for unknown value of type class java.sql.Timestamp at org.elasticsearch.common.xcontent.XContentBuilder.unknownValue(XContentBuilder.java:833) ~[na:na] at org.elasticsearch.common.xcontent.XContentBuilder.map(XContentBuilder.java:888) ~[na:na] at org.elasticsearch.common.xcontent.XContentBuilder.map(XContentBuilder.java:870) ~[na:na] at org.elasticsearch.action.index.IndexRequest.source(IndexRequest.java:376) ~[na:na] at org.elasticsearch.action.index.IndexRequest.source(IndexRequest.java:365) ~[na:na] at org.elasticsearch.action.update.UpdateRequest.doc(UpdateRequest.java:643) ~[na:na] at com.alibaba.otter.canal.client.adapter.es7x.support.ESConnection$ES7xUpdateRequest.setDoc(ESConnection.java:222) ~[na:na]
原因分析及解决方案
情况一
es中字段类型为text,而mysql类型为date类型,es客户端不支持正确java.sql.Timestamp类型转换为字符串。
- 方案1:修改配置中的配置sql,调整Timestamp输出格式类型。
sql: "select id,date_format(createtime,'%Y-%m-%d %H:%I:%S') createtime from test_user"
- 方案2:修改es中字段类型为date
情况二
adapter向es中创字段时,mysql为timestamp类型,不能创建字段。
- 方案1
手动在es创建这个字段
- 方案2
sql中timestemp将字段转换为字符串类型