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 ...
随机推荐
- AVS 端能力之音频播放模块
功能简介 音频播放 音频流播放 URL文件播放 播放控制 播放 暂停 继续 停止 其它功能(AVS服务器端实现) 支持播放列表 支持上一首下一首切换 支持电台 事件指令集 AudioPlayer 端能 ...
- turtle setup和screensize
关于setup有明确的定义,它包括4个参数width,height,startx,starty, setup定义窗体的大小和相对位置,并隐含定义了画布的位置,缺省是居中占整个屏幕的一半[setup() ...
- Kettle学习笔记(二)— 基本操作
目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...
- vue-devtools 安装
vue火了很久了,但是一直赶不上时代步伐的我今天才开始学,首先,根据vue官网介绍,推荐安装Vue Devtools.它允许你在一个更友好的界面中审查和调试 Vue 应用. 首先,将vue-devto ...
- docker-compose 搭建kafka集群
docker-compose搭建kafka集群 下载镜像 1.wurstmeister/zookeeper 2.wurstmeister/kafka 3.sheepkiller/kafka-manag ...
- 5-基本的sql查询以及函数的使用
基本SQL查询语句以及函数的使用 格式元素 描述 YYYY 四位的年份 MONTH 月份的英文全称 MON 月份的英文简写 MM 月份的数字表示 DD 日起的1-31数字表示 D 星期几的数字表示1- ...
- Fikker 管理平台弱口令
官网:www.fikker.com 应用介绍:Fikker 是一款面向 CDN/站长 的专业级网站缓存(Webcache)和反向代理服务器软件(Reverse Proxy Server). 发现过程: ...
- 【Java虚拟机11】线程上下文类加载器
前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- Scrum Meeting 13
第13次例会报告 日期:2021年06月05日 会议主要内容概述: 团队成员均明确了下一步的目标,进度突飞猛进辣 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下 ...