我建议使用Solr 来处理您的数据,它支持indexing of CSV data。
Solr 解决了与上传、下载和搜索数据相关的问题。它的性能使得索引可以轻松更新或从头开始重新构建。
示例
安装 Solr
阅读有关如何安装 Solr 的文档。以下是使该演示在 Linux 上运行的“启动”:
wget http://www.apache.org/dist/lucene/solr/3.5.0/apache-solr-3.5.0.tgz
tar zxvf apache-solr-3.5.0.tgz
cd apache-solr-3.5.0/example
java -jar start.jar
以下 URL 上提供的 Solr 管理屏幕
http://localhost:8983/solr/admin/
生成样本数据
编写了一个 groovy 脚本来生成一个示例 CSV 文件。
new File("data.csv").withWriter { writer ->
writer.println "id;A_s;B_i;C_s;D_s;E_s;F_s"
for (i in 1..500000) {
writer.println "${i};${i*10};${i*20};${i*30};${i*40};${i*50};${i*60}"
}
}
例子
id;A_s;B_i;C_s;D_s;E_s;F_s
1;10;20;30;40;50;60
2;20;40;60;80;100;120
3;30;60;90;120;150;180
4;40;80;120;160;200;240
5;50;100;150;200;250;300
6;60;120;180;240;300;360
7;70;140;210;280;350;420
8;80;160;240;320;400;480
9;90;180;270;360;450;540
..
注意:
我没有对“开箱即用”的 Solr 设置进行任何自定义。这意味着
- 默认 Solr 配置需要一个唯一的 id 字段
- 将“_s”附加到列名表示字符串字段。请参阅 Solr 中的 dynamic fields 功能
- 将 B 列加载为整数 (B_i) 以启用数字排序
有关如何编写自定义架构的详细信息,请参阅Solr Wiki。
加载 CSV 文件
Linux curl 命令用于通过执行 HTTP 发布操作来加载 data.csv 文件:
$ curl 'http://localhost:8983/solr/update/csv?separator=;&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @data.csv
注意:
- 在大约 90 秒内加载 500,000 行数据
- 使用separator参数表示数据不被默认“,”分隔
- 使用 commit 参数表示数据最后提交到索引。
查询数据
以下查询返回按 B 列排序的前 50 行
http://localhost:8983/solr/select/?q=*:*&rows=50&sort=B_i+desc&fl=id,A_s,B_i,C_s,D_s,E_s,F_s&wt=csv
输出为 CSV 格式:
id,A_s,B_i,C_s,D_s,E_s,F_s
500000,5000000,10000000,15000000,20000000,25000000,30000000
499999,4999990,9999980,14999970,19999960,24999950,29999940
499998,4999980,9999960,14999940,19999920,24999900,29999880
499997,4999970,9999940,14999910,19999880,24999850,29999820
499996,4999960,9999920,14999880,19999840,24999800,29999760
..
REST parameters:
|-------------------------------|------------------------------|
| Rest parameter | Description |
|-------------------------------|------------------------------|
| q=*:* | Everything. |
| rows=50 | Number of rows to output |
| sort=B_i+desc | descending order, sort on B_i|
| fl=id,A_s,B_i,C_s,D_s,E_s,F_s | columns to include |
| wt=csv | CSV output |
|-------------------------------|------------------------------|