从es将数据导出分两步:
- 查询大量数据
- 将数据生成文件并下载
本篇主要是将第二步,第一步在《es实战之查询大量数据》中已讲述。
csv vs excel
excel2003不能超过65536, excel2007及以上版本支持1048576条数据。excel支持的数据量有限,并且生生成文件的速度比较慢。
csv具有支持写入量大,文件较小的优点。
故选择csv作为导出文件类型。
导出文件的几种方式:
将数据从es中查询出来,在这个大前提下,对比导出文件的速度。
由前端处理
直接将数据返回给前端,由前端生成csv文件。
存在问题:
- content download slow
当数据量较大时,数据网络传输延迟较大。如果时间太长,且前后端分离,采用nginx做反向代理时,会出现ClientAbortException:java,需调整nginx参数。
字符流
使用StringReader
将数据从es中查询出来后,将数据拼接成String, 并交由StringReader处理。
此种方式拼接字符串的过程比较耗时。
字节流
采用super-csv : https://github.com/super-csv/super-csv.
super-csv可以高效生产csv文件。
处理过程:
从es中查询数据-->采用super-csv生产csv文件-->用字节流方式读取文件-->response.outputStream.write()
其他
如果是内部使用,可以使用kibana中的csv文件导出功能。