es数据导出
有大数据量导出的需求
整体思路:分页查询es,一页查询2000条,下一页查询的截止时间取上一页最后一条记录的创建时间(因为分页是按照创建时间逆序排列的),组装最后导出的list,利用EasyExcel导出到excel表里。
结果实际测试中遇到一些问题,记录一下
(1)少量数据没问题
(2)数据多时,excel导出报错了,.xls最大只支持65535行 --->调整成.xlsx多个sheet,一个sheet 10w条数据,改成分批写入excel(避免一个大list OOM)
(3)数据条数有问题,es查询某个时间区间数据条数和导出的excel里的条数不一致,导出的总是少一些 -->
解决办法:
一开始我发现es的时间区间查询用的from to,后来直接改成gte lte,也就是闭区间,想着这样下一页和上一页同一秒如果有重复订单也不会遗漏吧。
但这样导出会有重复数据,于是又改造了一下把上一页数据的id都保存下来,下一页查询要导出时,过滤下上一页的id,如果已经存在,则不必加入导出队列
但这样发现导出的条数总是少一些,导出数量越多缺失的越多!到底哪里有问题呢,后来从es的kibbana命令看突然发现一个问题,es的时间是带毫秒的,而我查出来之后转成的date只到秒,所以,第一页的创建时间如果是40秒.738Z,解决办法分页查询的下一页的截止时间是上一页截止时间+1秒。再次导出,总数对上了,终于解决了,但这里估计细究还是有一个小问题(如果一秒内有2000+数据)那这里可能就死循环了。