1. 现在需要快算分析一个2gcsv文件;
  1. 基于掌握的知识,使用java按行读取文件,批量导入数据到es
  1. 然后利用es强大的聚合能力分析数据,2个小时搞定!

  1. package com.example.demo;
  2.  
  3. import com.alibaba.fastjson.JSON;
  4. import com.example.demo.entity.Entity;
  5. import org.apache.commons.io.FileUtils;
  6. import org.apache.commons.io.LineIterator;
  7. import org.elasticsearch.action.bulk.BulkRequest;
  8. import org.elasticsearch.action.index.IndexRequest;
  9. import org.elasticsearch.action.index.IndexResponse;
  10. import org.elasticsearch.client.RequestOptions;
  11. import org.elasticsearch.client.RestHighLevelClient;
  12. import org.elasticsearch.common.xcontent.XContentType;
  13. import org.junit.jupiter.api.Test;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Qualifier;
  16. import org.springframework.boot.test.context.SpringBootTest;
  17.  
  18. import java.io.File;
  19. import java.io.IOException;
  20. import java.util.ArrayList;
  21. import java.util.Date;
  22. import java.util.List;
  23. import java.util.Objects;
  24.  
  25. /**
  26. * 读取大文件
  27. * csv格式
  28. *
  29. * @author lhb
  30. * @date 2021/11/11
  31. * @since 1.0.0
  32. */
  33. @SpringBootTest
  34. public class ImportTest {
  35.  
  36. @Autowired
  37. @Qualifier("client")
  38. private RestHighLevelClient restHighLevelClient;
  39.  
  40. @Test
  41. void insert() {
  42.      //csv文件2G,63W条数据,十多个字段
  43. String filePath = "D:\\file\\20211111.csv";
  44.  
  45. LineIterator it = null;
  46. try {
  47. it = FileUtils.lineIterator(new File(filePath), "UTF-8");
  48.  
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. try {
  53. while (it.hasNext()) {
  54. String line = it.nextLine();
  55. //System.out.println("line = " + line);
  56. //文件是CSV文件,CSV文件中的每一列是用","隔开的,这样就可以得到每一列的元素
  57. String[] strArray = line.split(",");
  58. //有很长的空格,trim一下
  59. String name = strArray[6].trim();
  60. String code = strArray[8].trim();
  61. String num = strArray[11].trim();
  62. System.out.println(code + "==" + num);
  63.  
  64. Entity entity = new Entity();
  65. entity.setCode(code);
  66. if (Objects.equals("xxx", code)) {
  67. //跳过表头
  68. continue;
  69. }
  70. entity.setNum(Long.parseLong(num));
  71. entity.setName(name);
  72. entity.setCreateTime(new Date());
  73. String index = "index20211111";
  74. singleInsert2(index, entity);
  75. }
  76. } finally {
  77. LineIterator.closeQuietly(it);
  78. }
  79. }
  80.  
  81. @Test
  82. void batchInsert() {
  83.  
  84. String filePath = "D:\\express\\20211111.csv";
  85.  
  86. LineIterator it = null;
  87. try {
  88. it = FileUtils.lineIterator(new File(filePath), "UTF-8");
  89.  
  90. } catch (IOException e) {
  91. e.printStackTrace();
  92. }
  93. try {
  94. int i = 0;
  95. List<Entity> entities = new ArrayList<>();
  96.  
  97. while (it.hasNext()) {
  98. String line = it.nextLine();
  99. //System.out.println("line = " + line);
  100. String[] strArray = line.split(",");
  101. String code = strArray[6].trim();
  102. String name = strArray[8].trim();
  103. String num = strArray[11].trim();
  104. System.out.println(code + "==" + num);
  105.  
  106. if (Objects.equals("xxx", code)) {
  107. //跳过表头
  108. continue;
  109. }
  110. Entity entity = new Entity();
  111. entity.setCode(code);
  112. entity.setName(name);
  113. try {
  114. entity.setNum(Long.parseLong(num));
  115. } catch (NumberFormatException e) {
  116. e.printStackTrace();
  117. System.out.println("出错的数据" + code + "==" + num);
  118. }
  119. entity.setCreateTime(new Date());
  120. String index = "index20211111";
  121.  
  122. //批量插入
  123. entities.add(entity);
  124. i++;
  125. if (i % 10000 == 0) {
  126. System.out.println("i = " + i);
  127. try {
  128. batchInsert2(index, entities);
  129. } catch (IOException e) {
  130. e.printStackTrace();
  131. }
  132. //清空已经处理过的list
  133. entities.clear();
  134. i = 0;
  135. }
  136. }
  137. } finally {
  138. LineIterator.closeQuietly(it);
  139. }
  140. }
  141.  
  142. /**
  143. * 批量速度杠杠的
  144. *
  145. * @param index
  146. * @param entities
  147. * @throws IOException
  148. */
  149. public void batchInsert2(String index, List<Entity> entities) throws IOException {
  150. BulkRequest bulkRequest = new BulkRequest(index);
  151. System.out.println("entities.sz = " + entities.size());
  152. for (Entity org : entities) {
  153. IndexRequest request = new IndexRequest();
  154. request.source(JSON.toJSONString(org), XContentType.JSON);
  155. bulkRequest.add(request);
  156. }
  157. restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  158. }
  159.  
  160. /**
  161. * 数据量大,超级慢
  162. *
  163. * @param index
  164. * @param entity
  165. */
  166. public void singleInsert2(String index, Entity entity) {
  167. IndexRequest request = new IndexRequest(index);
  168. request.source(JSON.toJSONString(entity), XContentType.JSON);
  169. try {
  170. IndexResponse index1 = restHighLevelClient.index(request, RequestOptions.DEFAULT);
  171. } catch (IOException e) {
  172. e.printStackTrace();
  173. }
  174. }
  175. }
  1. package com.example.demo.entity;
  2.  
  3. import lombok.Data;
  4.  
  5. import java.util.Date;
  6.  
  7. /**
  8. * @author lhb
  9. * @date 2021/11/11
  10. * @since 1.0.0
  11. */
  12. @Data
  13. public class Entity {
  14.  
  15. /**
  16. * 编码
  17. */
  18. private String code;
  19. /**
  20. * 名字
  21. */
  22. private String name;
  23. /**
  24. * 数量
  25. */
  26. private Long num;
  27. private Date createTime;
  28.  
  29. }
  1. 创建索引映射,然后插入数据:
  2.  
  3. PUT express_to_village20211104
  4. {
  5. "settings": {
  6. "number_of_shards": 1,
  7. "number_of_replicas": 1
  8. },
  9. "mappings": {
  10. "properties": {
  11. "code": {
  12. "type": "keyword"
  13. },
  14. "name": {
  15. "type": "keyword"
  16. },
  17. "num": {
  18. "type": "long"
  19. },
  20. "createTime": {
  21. "type": "date"
  22. }
  23. }
  24. }
  25. }

开始分析数据:

  1. GET index20211111/_count
  2. {}

#返回63w数据

{
"count" : 630000,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}

  1. GET index20211111/_search
  2. {
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "terms": {
  7. "code": [
  8. 2222,
  9. 1111,
  10. 3333
  11. ]
  12. }
  13. }
  14. }
  15. },
  16. "size": 1,
  17. "track_total_hits": true,
  18. "aggs": {
  19. "per_code": {
  20. "terms": {
  21. "field": "code",
  22. "size": 200
  23. },
  24. "aggs": {
  25. "num": {
  26. "sum": {
  27. "field": "num"
  28. }
  29. }
  30. }
  31. },
  32. "sum_num": {
  33. "sum": {
  34. "field": "num"
  35. }
  36. }
  37. }
  38. }

java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)的更多相关文章

  1. java读取 500M 以上文件,java读取大文件

    java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...

  2. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...

  3. 解决java读取大文件内存溢出问题

    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new ...

  4. Java读取大文件的高效率实现

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...

  5. java读取大文件 超大文件的几种方法

    java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能       import java.io.BufferedReader; import java.io.File; import jav ...

  6. java读取大文件

    1  多线程 2  java内存映射读取大文件

  7. Java 读取大文件方法

    需求:实际开发中读取文本文件的需求还是很多,如读取两个系统之间FTP发送文件,读取后保存到数据库中或日志文件的数据库中保存等. 为了测试首先利用数据库SQL生成大数据文件. 规则是 编号|姓名|手机号 ...

  8. java读取大文本文件

    原文:http://blog.csdn.net/k21325/article/details/53886160 小文件当然可以直接读取所有,然后放到内存中,但是当文件很大的时候,这个方法就行不通了,内 ...

  9. Java读取各种文件格式内容

    所需的jar包哦也不要太记得了,大家可以搜搜,直接上代码: import java.io.BufferedInputStream; import java.io.File; import java.i ...

随机推荐

  1. AVS 端能力之音频播放模块

    功能简介 音频播放 音频流播放 URL文件播放 播放控制 播放 暂停 继续 停止 其它功能(AVS服务器端实现) 支持播放列表 支持上一首下一首切换 支持电台 事件指令集 AudioPlayer 端能 ...

  2. turtle setup和screensize

    关于setup有明确的定义,它包括4个参数width,height,startx,starty, setup定义窗体的大小和相对位置,并隐含定义了画布的位置,缺省是居中占整个屏幕的一半[setup() ...

  3. Kettle学习笔记(二)— 基本操作

    目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...

  4. vue-devtools 安装

    vue火了很久了,但是一直赶不上时代步伐的我今天才开始学,首先,根据vue官网介绍,推荐安装Vue Devtools.它允许你在一个更友好的界面中审查和调试 Vue 应用. 首先,将vue-devto ...

  5. docker-compose 搭建kafka集群

    docker-compose搭建kafka集群 下载镜像 1.wurstmeister/zookeeper 2.wurstmeister/kafka 3.sheepkiller/kafka-manag ...

  6. 5-基本的sql查询以及函数的使用

    基本SQL查询语句以及函数的使用 格式元素 描述 YYYY 四位的年份 MONTH 月份的英文全称 MON 月份的英文简写 MM 月份的数字表示 DD 日起的1-31数字表示 D 星期几的数字表示1- ...

  7. Fikker 管理平台弱口令

    官网:www.fikker.com 应用介绍:Fikker 是一款面向 CDN/站长 的专业级网站缓存(Webcache)和反向代理服务器软件(Reverse Proxy Server). 发现过程: ...

  8. 【Java虚拟机11】线程上下文类加载器

    前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...

  9. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

  10. Scrum Meeting 13

    第13次例会报告 日期:2021年06月05日 会议主要内容概述: 团队成员均明确了下一步的目标,进度突飞猛进辣 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下 ...