java 大数据处理方案

yn799890274 2014-05-23 01:47:42
加精
问题描述:近期做了数据对接的一个项目,就是从远程ftp服务器上,取csv文件,然后把csv文件里的数据录入到所做项目的数据库中,比方说我读一个csv文件,大概有近6万条数据,在录入过程中,我得查询每条记录在数据库中是否存在,如果存在并且没有什么变化,就过滤掉该条数据,如果存在,且有变化,就做更新,如果不存在,就做插入。
处理方案:计算总共有数据n条,每次处理5000条数据,然后计算出总共处理次数,再根据总处理次数,循环这5000条数据,然后连接数据库批处理这5000条数据,总共执行时间大约为10分钟左右,这种速度慢吗?有没有更好的解决方案?
...全文
17546 53 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
guodefu909 2014-06-26
  • 打赏
  • 举报
回复
1.没有delete只有insert 和 update ,很适合用merge into ,匹配到更新(不进行是否一致的判断,浪费时间),没匹配到就插入。 2.用个临时表或实体表中转一下,把数据都读取到中转表中,一次merge搞定 3.搞个定时任务自动执行,以后不用自己操心了
u010557116 2014-06-25
  • 打赏
  • 举报
回复
补充下: 可以借鉴 全量 和增量 这个2个概念
u010557116 2014-06-25
  • 打赏
  • 举报
回复
文件都有自己的 修改日期
u010557116 2014-06-25
  • 打赏
  • 举报
回复
给你个提示 ,弄一个编辑日期这个字段。
siling5998 2014-05-28
  • 打赏
  • 举报
回复
楼主说问题主要在比较,以下是sqlserver中的一个比较插入 INSERT INTO [dbo].[A] ([F1] ,[F2]) select [F1] ,[F2] from [dbo].B where (select count(1) as num from [dbo].[A] where A.F1= B.F1 ) = 0 效率还是可以,您可以试试,再者,批量插入临时表要一次写入更多的数据5000条太少,如果服务器够好,可以不能考虑分批
xiaoxiangqing 2014-05-28
  • 打赏
  • 举报
回复
先插入临时表,再来比较
sxl-shuai 2014-05-27
  • 打赏
  • 举报
回复
楼主有好的代码分享下,谢谢
1路相随 2014-05-27
  • 打赏
  • 举报
回复
和我所维护的系统的batch处理方式一模一样。我们系统现在是csv35万条数据,也是遇到了处理速度的瓶颈,我是ERP。上个月进行过一次简单优化。对您的问题有以下见解:①根本没必要查询数据是否存在(浪费大量时间),直接做更新,如果更新结果为0条,考虑insert,这样基本不会有什么处理时间花销。更高性能可考虑merge。②建临时表是很好的解决方案,不知你们为什么不允许,反正我们允许,效果也很好
jerry03123 2014-05-27
  • 打赏
  • 举报
回复
学习了!!大侠们
光明消逝 2014-05-27
  • 打赏
  • 举报
回复
全表删除,基本数据库30万数据,需要导入1万条,怎么也不可能删除
光明消逝 2014-05-27
  • 打赏
  • 举报
回复
这个,我现在也在做导入,不过是从EXCEL导入 需要判断几个字段的数据是否存在,比如员工啊,地区啊之类的,散在好几个表里 我现在是先把表的数据提到后台,后台验证后以后UPDATE和insert, 正如楼上所说的,会出现内存问题, 做FOR循环连接数据库验证确实很慢 也很头疼
softroad 2014-05-27
  • 打赏
  • 举报
回复
如果是mysql可以设置innodb_flush_log_at_trx_commit的值
softroad 2014-05-27
  • 打赏
  • 举报
回复
不能把数据都删除后,全部插入吗?
yn799890274 2014-05-27
  • 打赏
  • 举报
回复
引用 40 楼 u012848045 的回复:
和我所维护的系统的batch处理方式一模一样。我们系统现在是csv35万条数据,也是遇到了处理速度的瓶颈,我是ERP。上个月进行过一次简单优化。对您的问题有以下见解:①根本没必要查询数据是否存在(浪费大量时间),直接做更新,如果更新结果为0条,考虑insert,这样基本不会有什么处理时间花销。更高性能可考虑merge。②建临时表是很好的解决方案,不知你们为什么不允许,反正我们允许,效果也很好
嗯,做临时表确实是很好的解决方案,已经向上头提了,非常感谢
austin9972 2014-05-26
  • 打赏
  • 举报
回复
zapdos 2014-05-26
  • 打赏
  • 举报
回复
hash一下,做个索引
yn799890274 2014-05-26
  • 打赏
  • 举报
回复
非常感谢各位的回答,学习了,3Q
yn799890274 2014-05-26
  • 打赏
  • 举报
回复
引用 22 楼 wrong1111 的回复:
你的数据有三种 1,数据库不存在,插入操作 2,数据库存在,更新操作。 可否考虑,初始化把数据库存在的关键信息缓存,每次处理前,把所有的数据优先处理更新,后处理插入? 也就是说,每次处理的时候,不必要循环与数据库查询,来达到减少数据库交互。、 另外,有没有估算下,数据库不存在数据量与存在的数据量各占多大的比重?
第一次同步,是全量同步,第二第同步有可能只是几条记录而已
yn799890274 2014-05-26
  • 打赏
  • 举报
回复
引用 19 楼 sjlzcj 的回复:
相同数据比较的依据是什么?
就是比较几个字段是否相同
king1076 2014-05-25
  • 打赏
  • 举报
回复
楼主 可以这样,对每一条记录进行 hash 校验,不用md5, 每次插入数据的时候 检查一下 此记录的hash 是否存在,如果存在就丢弃,否则就插入。 用一个hash map来记录 hash
加载更多回复(26)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧