愚者求师之过,智者从师之长。

logstash向es中导入mysql数据,tinyint字段导入过程中抛出mapper_parsing_exception类型异常

Logstash | 作者 piggyci | 发布于2017年12月20日 | 阅读数:9501

使用logstash向elasticsearch导入mysql数据,有一个is_sync的字段,数据库类型为tinyint(1),在logstash导入过程中,报错
 
错误信息为:
[2017-12-20T14:02:56,939][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"exam", :_type=>"exam", :_routing=>nil}, #<LogStash::Event:0x2a099160>], :response=>{"index"=>{"_index"=>"exam", "_type"=>"exam", "_id"=>"9xSEcmABD-UhuoDsiTy5", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse [is_sync]", "caused_by"=>{"type"=>"i_o_exception", "reason"=>"Current token (VALUE_FALSE) not numeric, can not use numeric value accessors\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@4ad19246; line: 1, column: 355]"}}}}}
 
es中的mapping为:
"is_sync": {
                        "type": "byte"
                    }
 
已邀请:

piggyci

赞同来自: guotenv

已解决,但不知问题的根源,隐约猜测是mysql的导出Jar会默认将tinyint(1)转换为boolean,0则为false,大于0则为true。
 
解决方法是 将tinyint(1)数据库改为tinyint(4),tinyint(4)就会默认转成数字,es的mapping用byte接受即可。
 
另:如果无法改动数据库字段,我查看其它帖子,说是查询时将tinyint(1)字段乘以1后,再作为结果输出,后台mapping使用integer即可(但未亲测,不知)是否可行

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

es中改成int试试

guotenv

赞同来自:

管用

要回复问题请先登录注册