1. 程式人生 > >es實戰之數據導出成csv文件

es實戰之數據導出成csv文件

前後端 問題 打開 thead ont ref com gpo gre

從es將數據導出分兩步:

  1. 查詢大量數據
  2. 將數據生成文件並下載

本篇主要是將第二步,第一步在《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文件導出功能。

實踐中遇到的問題及解決方法

  1. 表頭亂碼問題
    JAVA以UTF-8導出CSV文件,用excel打開產生亂碼的解決方法
  2. 中文文件名亂碼問題
    文件下載 response.setHeader()下載中文文件名亂碼問題 解決辦法
  3. 空格URL編碼的正確使用姿勢

es實戰之數據導出成csv文件