当前位置: 代码迷 >> Java Web开发 >> java 大数据处理草案
  详细解决方案

java 大数据处理草案

热度:516   发布时间:2016-04-16 22:22:40.0
java 大数据处理方案
问题描述:近期做了数据对接的一个项目,就是从远程ftp服务器上,取csv文件,然后把csv文件里的数据录入到所做项目的数据库中,比方说我读一个csv文件,大概有近6万条数据,在录入过程中,我得查询每条记录在数据库中是否存在,如果存在并且没有什么变化,就过滤掉该条数据,如果存在,且有变化,就做更新,如果不存在,就做插入。
处理方案:计算总共有数据n条,每次处理5000条数据,然后计算出总共处理次数,再根据总处理次数,循环这5000条数据,然后连接数据库批处理这5000条数据,总共执行时间大约为10分钟左右,这种速度慢吗?有没有更好的解决方案?
------解决方案--------------------
首先,执行插入语句的时候可以采用批处理的方式一批一批的执行
第二,不要频繁开启关闭数据库连接,可以采用一些成熟的jdbc连接池
第三,如果内存足够充裕,可以考虑对查询过的数据进行本地缓存,减少数据库IO
------解决方案--------------------
引用:
Quote: 引用:

数据一条一条的搞, 你得先搞清楚哪里是最大的瓶颈。是对比存在与否慢,还是解析文件慢,或者更新数据慢?

解析文件和更新数据库都不慢,就是对比存在与否有点慢了,期间经过频繁的开启关闭数据库连接

对比慢可以考虑使用md5,把所有字段都值都组成一个字符串,比如:I字段1_字段2,根据这个串取md5,放到一个字段内,对这个字段建立索引,对比存在时可以查询这个字段来区分。数据库连接好办,不管是普通连接,或者数据源,一个文件或者批次使用一个连接就行了。
------解决方案--------------------
如果是更新录入数据到表B, 是否可以考虑将全部数据先插入一个表A中, 然后拿表A与表B进行联合查询, 不存在的插入, 存在且数据有变化的更新, 在清除表A数据. 这样的话先将数据快速批量插入数据库之后, 只需执行更新和插入, 就不用频繁的查询比较了. 
------解决方案--------------------
把每次的文件导入到临时表,然后执行存储过程不是更好,让数据库来完成这些业务
------解决方案--------------------
把csv 里的数据存放到一张新表中  ,  利用sql 去比较 不知行否   
------解决方案--------------------
你的数据有三种
1,数据库不存在,插入操作
2,数据库存在,更新操作。

可否考虑,初始化把数据库存在的关键信息缓存,每次处理前,把所有的数据优先处理更新,后处理插入?
也就是说,每次处理的时候,不必要循环与数据库查询,来达到减少数据库交互。、
另外,有没有估算下,数据库不存在数据量与存在的数据量各占多大的比重?
------解决方案--------------------

------解决方案--------------------
临时表,为什么不允许啊?
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

数据一条一条的搞, 你得先搞清楚哪里是最大的瓶颈。是对比存在与否慢,还是解析文件慢,或者更新数据慢?

解析文件和更新数据库都不慢,就是对比存在与否有点慢了,期间经过频繁的开启关闭数据库连接

对比慢可以考虑使用md5,把所有字段都值都组成一个字符串,比如:I字段1_字段2,根据这个串取md5,放到一个字段内,对这个字段建立索引,对比存在时可以查询这个字段来区分。数据库连接好办,不管是普通连接,或者数据源,一个文件或者批次使用一个连接就行了。


这是个好主意,而且如果在把md5值结合缓存的话,可能效率更高。
------解决方案--------------------
楼主 可以这样,对每一条记录进行 hash 校验,不用md5, 每次插入数据的时候 检查一下 此记录的hash 是否存在,如果存在就丢弃,否则就插入。

用一个hash map来记录 hash 
------解决方案--------------------
用存储过程,在存储过程中判断数据,在存储过程中对数据是否存在进行判别,速度应该能快些吧?
------解决方案--------------------
个人建议,先把数据灌到临时表中,断开连接,再跑一个专门处理数据的SP,速度肯定能上来。
------解决方案--------------------
用HashMap保存容易造成机器内存不够用,感觉还是放缓存好点。
------解决方案--------------------