大量csv数据的查询和计算的技术实现路径分析(1)

本文探讨处理大量CSV数据的高效查询与计算方法。针对内存消耗问题,提出了使用Java StringBuffer替代split,以及使用OpenCSV工具类的解决方案。并计划讨论Hdfs、Hbase和Spark在CSV数据处理中的应用。
摘要由CSDN通过智能技术生成

在工作中,会有处理很多数据的场景。

比如,

用户需求:

我有大量数据,

(1)我想要高效查询我想要的数据。

(2)我想要高效计算出我想要的结果数据。

为了存储数据,我们使用的数据存储方式有

mysql,oracle,表;

csv文件

excel文件

hdfs文件系统

hbase

redis,ehcache

把数据从存储区拿出来作分析,我们使用的数据分析手段有

java单机计算,分布式计算

hadoop集群

spark集群

redis集群


利用以上的手段,怎么做?

当然用户需求不是这么简单的2句话,本人也不是要写一本书来概括这些技术实现方案,相反,这些不是本文的重点,本文的重点是,以自己的经验,提出一个可实现流程,然后分析每个环节可行性和难点。这是本文将要写的主要内容。

先细化一下需求,目前需求只有一个,就是:
有很多csv文件数据,如何高效查询csv数据?

那么,为实现上面的需求,需要做一些技术可行性的探讨。
目录如下:

目录

Java Split探讨

利用Hdfs存取探讨

利用Hbase存取探讨

利用Spark计算csv数据探讨

1.Java Split探讨
为什么首先要探讨split呢?

首先说到java string,string 对象一旦创建,就是不可变的,类似:

String str = "a";

str = "b";

其实是创建了2个对象。

第二,split() 方法,解析split方法的实现时发现,split切分的生成每个substring(子字符串)实际引用是初始字符串对象的char[],比如:

String str = "a,b,c,d";

String[] strArr = str.split(",");

int strArrLen = strArr.length();

strArrLen=4,就是说会在内存中增加4个str大小的内存消耗。

初始字符串越长,split方法的内存消耗就越大。在实际应用中,会增加内存溢出的风险(java.lang.OutOfMemoryError)。

实际上,我们就遇到了。我们一个csv文件的列有几千个,使用split切分列,随着文件的增多,就导致了以下2个问题:

(1)内存消耗很大

(2)内存不会及时清理

做个计算便知:
假设一个csv文件有2000列,平均每列10个字符,每个字符占2个字节,
eachLineSize:2000×10×2/1024=39kB;
一万行:
39×10000/1024=381M
这个内存消耗大小是比较大的。

可是,使用java处理csv,是少不了字符串处理的。

有同事提出调大jvm内存,虽然短期内有效果,但风险是比较高的。

针对这个问题,笔者查找了一些资料,也对string,split等做了一些研究,发现,这个是有解决方法的(意料之中的,毕竟string,csv处理以前就有这样的需求,那么就会有相应的解决方案)。

方法1

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CSVUtils {

    private static final char DEFAULT_SEPARATOR = ',';
    private static final char DEFAULT_QUOTE = '"';

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值