java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)
现在需要快算分析一个2g的csv文件;
基于掌握的知识,使用java按行读取文件,批量导入数据到es,
然后利用es强大的聚合能力分析数据,2个小时搞定!
package com.example.demo; import com.alibaba.fastjson.JSON;
import com.example.demo.entity.Entity;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest; import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects; /**
* 读取大文件
* csv格式
*
* @author lhb
* @date 2021/11/11
* @since 1.0.0
*/
@SpringBootTest
public class ImportTest { @Autowired
@Qualifier("client")
private RestHighLevelClient restHighLevelClient; @Test
void insert() {
//csv文件2G,63W条数据,十多个字段
String filePath = "D:\\file\\20211111.csv"; LineIterator it = null;
try {
it = FileUtils.lineIterator(new File(filePath), "UTF-8"); } catch (IOException e) {
e.printStackTrace();
}
try {
while (it.hasNext()) {
String line = it.nextLine();
//System.out.println("line = " + line);
//文件是CSV文件,CSV文件中的每一列是用","隔开的,这样就可以得到每一列的元素
String[] strArray = line.split(",");
//有很长的空格,trim一下
String name = strArray[6].trim();
String code = strArray[8].trim();
String num = strArray[11].trim();
System.out.println(code + "==" + num); Entity entity = new Entity();
entity.setCode(code);
if (Objects.equals("xxx", code)) {
//跳过表头
continue;
}
entity.setNum(Long.parseLong(num));
entity.setName(name);
entity.setCreateTime(new Date());
String index = "index20211111";
singleInsert2(index, entity);
}
} finally {
LineIterator.closeQuietly(it);
}
} @Test
void batchInsert() { String filePath = "D:\\express\\20211111.csv"; LineIterator it = null;
try {
it = FileUtils.lineIterator(new File(filePath), "UTF-8"); } catch (IOException e) {
e.printStackTrace();
}
try {
int i = 0;
List<Entity> entities = new ArrayList<>(); while (it.hasNext()) {
String line = it.nextLine();
//System.out.println("line = " + line);
String[] strArray = line.split(",");
String code = strArray[6].trim();
String name = strArray[8].trim();
String num = strArray[11].trim();
System.out.println(code + "==" + num); if (Objects.equals("xxx", code)) {
//跳过表头
continue;
}
Entity entity = new Entity();
entity.setCode(code);
entity.setName(name);
try {
entity.setNum(Long.parseLong(num));
} catch (NumberFormatException e) {
e.printStackTrace();
System.out.println("出错的数据" + code + "==" + num);
}
entity.setCreateTime(new Date());
String index = "index20211111"; //批量插入
entities.add(entity);
i++;
if (i % 10000 == 0) {
System.out.println("i = " + i);
try {
batchInsert2(index, entities);
} catch (IOException e) {
e.printStackTrace();
}
//清空已经处理过的list
entities.clear();
i = 0;
}
}
} finally {
LineIterator.closeQuietly(it);
}
} /**
* 批量速度杠杠的
*
* @param index
* @param entities
* @throws IOException
*/
public void batchInsert2(String index, List<Entity> entities) throws IOException {
BulkRequest bulkRequest = new BulkRequest(index);
System.out.println("entities.sz = " + entities.size());
for (Entity org : entities) {
IndexRequest request = new IndexRequest();
request.source(JSON.toJSONString(org), XContentType.JSON);
bulkRequest.add(request);
}
restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
} /**
* 数据量大,超级慢
*
* @param index
* @param entity
*/
public void singleInsert2(String index, Entity entity) {
IndexRequest request = new IndexRequest(index);
request.source(JSON.toJSONString(entity), XContentType.JSON);
try {
IndexResponse index1 = restHighLevelClient.index(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.example.demo.entity; import lombok.Data; import java.util.Date; /**
* @author lhb
* @date 2021/11/11
* @since 1.0.0
*/
@Data
public class Entity { /**
* 编码
*/
private String code;
/**
* 名字
*/
private String name;
/**
* 数量
*/
private Long num;
private Date createTime; }
创建索引映射,然后插入数据: PUT express_to_village20211104
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"code": {
"type": "keyword"
},
"name": {
"type": "keyword"
},
"num": {
"type": "long"
},
"createTime": {
"type": "date"
}
}
}
}
开始分析数据:
GET index20211111/_count
{}
#返回63w数据
{
"count" : 630000,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
GET index20211111/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"code": [
2222,
1111,
3333
]
}
}
}
},
"size": 1,
"track_total_hits": true,
"aggs": {
"per_code": {
"terms": {
"field": "code",
"size": 200
},
"aggs": {
"num": {
"sum": {
"field": "num"
}
}
}
},
"sum_num": {
"sum": {
"field": "num"
}
}
}
}
java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)的更多相关文章
- java读取 500M 以上文件,java读取大文件
java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...
- 解决java读取大文件内存溢出问题
1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new ...
- Java读取大文件的高效率实现
1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...
- java读取大文件 超大文件的几种方法
java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 import java.io.BufferedReader; import java.io.File; import jav ...
- java读取大文件
1 多线程 2 java内存映射读取大文件
- Java 读取大文件方法
需求:实际开发中读取文本文件的需求还是很多,如读取两个系统之间FTP发送文件,读取后保存到数据库中或日志文件的数据库中保存等. 为了测试首先利用数据库SQL生成大数据文件. 规则是 编号|姓名|手机号 ...
- java读取大文本文件
原文:http://blog.csdn.net/k21325/article/details/53886160 小文件当然可以直接读取所有,然后放到内存中,但是当文件很大的时候,这个方法就行不通了,内 ...
- Java读取各种文件格式内容
所需的jar包哦也不要太记得了,大家可以搜搜,直接上代码: import java.io.BufferedInputStream; import java.io.File; import java.i ...
随机推荐
- CF587F-Duff is Mad【AC自动机,根号分治】
正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出\(n\)个字符串\(s\).\(q\)次询问给出\(l,r,k\)要求输出\(s_{l. ...
- mybatis多种查询方法
1. 查询单行,对象,并封装成一个对象 Employee getEmpById(Integer id); <select id="getEmpById" resultType ...
- 好未来数据中台 Node.js BFF实践(一):基础篇
好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...
- NOIP模拟69
T1 石子游戏 大坑未补 T2 大鱼吃小鱼 解题思路 set+桶可以得到 60pts (code) 线段树上二分每一次优先递归右区间从右区间贪心选择,并且记录下更改过的值,在处理完答案之后再复原回去. ...
- 使用 WPF + Chrome 内核实现 在线客服系统 的复合客服端程序
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署免费下载:https://docs.sh ...
- 聊聊我对 GraphQL 的一些认知
每隔一段时间就能看到一篇 GraphQL 的文章,但是打开文章一看,基本上就是简单的介绍下 GraphQL 的特性.很多文章其实就是 github 上找个 GraphQL 的项目,然后按照对应的 de ...
- docker - compose 部署 Nginx
主要介绍 docker 中 Nginx 的部署及项目目录挂载券的方法.docker 中部署一个服务,有三种方法,分别是 docker run.Dockerfile.docker-compose . 下 ...
- AI 事件驱动场景 Serverless 实践
作者 | 李鹏(元毅) 来源 | Serverless 公众号 一.事件驱动框架:Knative Eventing 事件驱动是指事件在持续事务管理过程中,进行决策的一种策略.可以通过调动可用资源执行相 ...
- Apache ShardingSphere 在京东白条场景的落地之旅
京东白条使用 Apache ShardingSphere 解决了千亿数据存储和扩容的问题,为大促活动奠定了基础. 2014 年初,"京东白条"作为业内互联网信用支付产品,数据量爆发 ...
- xml文件报Element 'beans' cannot have character [children],because the type's content type is element
写springMvc.xml文件时,偶然遇到 Element 'beans' cannot have character [children],because the type's content t ...