es實戰之數據導出成csv文件
阿新 • • 發佈:2018-04-05
前後端 問題 打開 thead ont ref com gpo gre
從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文件導出功能。
實踐中遇到的問題及解決方法
- 表頭亂碼問題
JAVA以UTF-8導出CSV文件,用excel打開產生亂碼的解決方法 - 中文文件名亂碼問題
文件下載 response.setHeader()下載中文文件名亂碼問題 解決辦法 - 空格URL編碼的正確使用姿勢
es實戰之數據導出成csv文件