python es.scan报异常: ValueError: invalid literal for int() with base 10: ‘‘

前文

  在用es.scan的时候,意外发现报错,而相关的错误网上没有资料可查,阅读官网也只是标明了通过raise_on_error来控制是否报出错误,但本身用es.scan就是为了大数据量的时候保证数据的完整性,如果跳过异常,那不是数据完整性得不到保证了,所以还是得确认问题异常。

问题排查

  通过堆栈异常:

  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/search.py", line 223, in _get_result
    return callback(hit)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/utils.py", line 413, in from_es
    doc._from_dict(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/utils.py", line 420, in _from_dict
    v = f.deserialize(v)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/field.py", line 95, in deserialize
    return self._deserialize(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/field.py", line 190, in _deserialize
    return self._wrap(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/field.py", line 167, in _wrap
    return self._doc_class.from_es(data, data_only=True)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/document.py", line 105, in from_es
    return super(InnerDoc, cls).from_es(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/utils.py", line 413, in from_es
    doc._from_dict(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/utils.py", line 420, in _from_dict
    v = f.deserialize(v)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/field.py", line 95, in deserialize
    return self._deserialize(data)
  File "/root/lyb/py3/lib/python3.6/site-packages/elasticsearch_dsl/field.py", line 317, in _deserialize
    return int(data)
ValueError: invalid literal for int() with base 10: ''

  可以确认是在scan内部报的异常,所以是第三方库的异常,第三方库的异常要么通过升级第三方库,要么通过定位到问题来绕过该报错。明显选择第二种思路,途中的int(data)报错,也就是data并不是数字字符串,而是空字符串’',导致在int的时候无法识别报错。但遗憾的是,没有标记出是哪个字段导致。
  此时最快的就是通过将记录定位到,然后通过查找""在该记录里面对应的字段,然后再查该字段是否是integer或者long类型即可。

问题解决

  在思路未清晰的时候,需要花大量的时间去定位es第三方库,但如果定位到是字段的异常,那就一切简单了;而es在bulk insert的时候,是没有在python端做这个校验,而在es.scan的时候去做了该校验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值