论坛首页 Java企业应用论坛

数据表每天五千四百万数据,,如何汇总

浏览 19123 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-01-05  
数据表table1每天五千四百万数据,十张分表(或者五十张分表),目前还未确定分表数,
数据量是确定了,根据表中四个字段(c1,c2,c3,c4)汇总,四个字段相同就可合为一条,累加金额。
目前的处理方式是使用java, 不考虑存储过程(公司限制,分表太多,存储过程不利于维护)

方案一,在内存中计算判断,累加,在内存中保存汇总结果, 因为数据量太大, 不是很合适。
方案二, 批量取出(如五千条),一批批汇总, 将结果插入临时表中。再进行汇总。
方案三, 将四个字段的某个字段作为分表维度, 这样子的结果就是,每个表中的汇总结果都会各自独立,不需要再次汇总, 缺点是 每张表的数据量可能不平均。

汇总完后,最后还有个处理过程就是,汇总结果表table2中的主键id 需要回填进 table1 对应的记录(为了表明table1的记录汇总到了table2中的某条记录)。

个人认为几张方案都不是很合适。

论坛大神有其他好的方案么。
   发表时间:2015-01-05  
听起来很适合用map/reduce
0 请登录后投票
   发表时间:2015-01-06  
这跟我做的一模一样,大数据汇总。  用的mysql, 也没什么办法。


直接内存汇总的。


汇总肯定是要查询所有的数据之后   才能计算,进行汇总操作。 

4.
汇总完后,最后还有个处理过程就是,汇总结果表table2中的主键id 需要回填进 table1 对应的记录(为了表明table1的记录汇总到了table2中的某条记录)。


这个处理 感觉不好吧? 还要操作数据源表? 更新操作吗?  会不会锁表?数据那么大。



根据表中四个字段(c1,c2,c3,c4)汇总 ,无论怎么做  这个汇总条件 查出的数据 都非常的大。 好像也没什么好方法。
0 请登录后投票
   发表时间:2015-01-06  
可以读取数据生成小数据文件,放在硬盘里,然后使用排序算法,hash切割,计算总额。
0 请登录后投票
   发表时间:2015-01-06  
关注一下这个话题,将来也许有用
0 请登录后投票
   发表时间:2015-01-06  
mark,看看大牛们的解决方案。
0 请登录后投票
   发表时间:2015-01-07  
看看大牛们的解决方案。
0 请登录后投票
   发表时间:2015-01-07  
我理解每天4千多万条数据不是瞬间过来的。比如应该每天白天工作时间过来的数据,每个小时几百万。这样的话,汇总必须要等所有数据都过来之后进行才有意义。

那么,我认为合适的方案应该是:
1,白天按照工作时间,比如会传数据的时间是10个小时,那么按照10个小时分10个表。
第一个小时过来的数据都去第一个表,第二个小时过来的数据去第二个表,以此类推。

2,建立一个历史表,这个表你可以是按天的历史,也可以是按照周,月的历史,看你的汇总需求了。

3,第一个小时过去后,把第一个表的数据都导入历史表去,以此类推,直到下班后数据全都进入历史表里面。这样做的好处是,数据表的插入和读取是完全时间分离的,从理论上避免了死锁发生的可能性。

4,汇总统计从历史表里面抽取数据汇总,因为这时候历史表里面有今天所有的数据,所以你愿意怎么汇总就怎么汇总,根据你说的这一部分需求,应该几个SQL就搞定了吧。

5,如果你有按照周或者月汇总的需求,相应建立周汇总的历史表或者月汇总的历史表即可。这和你自己管理的总汇总记录可以互相验证,互相检查。

你可能会觉得这么大量数据插入历史表比较费时间,不过我认为你是一个小时左右去插几百万,时间完全够,而且这个插入是insert into select 小时表 的操作,全部是数据库侧的动作,会很快的。如果性能确实是问题,那么可以考虑历史表先不建立索引,最后10个小时的数据都进去之后再建立索引,这种插入速度是飞快的。

当然,如果你24小时全部有数据过来,那么我说的方案可能就不是很合适,不过如果是这样的需求话,你怎么做汇总都不会百分百精确的吧。

这个方案是根据你说的需求想的,估计你实际中有很多限制,不过我觉得应该是这个思路走下去。
0 请登录后投票
   发表时间:2015-01-07  
你每次汇总一定要重头到尾计算一次?不能累加么? 建一张汇总记录表不就完了?几十亿的数据 都这样过来了
0 请登录后投票
   发表时间:2015-01-07  
handong890 写道
你每次汇总一定要重头到尾计算一次?不能累加么? 建一张汇总记录表不就完了?几十亿的数据 都这样过来了

有些需求确实根据以前累计的东西就能算出来,但是有些东西必须分析原始数据才可以。
汇总的需求是千奇百怪并且是不断变化的,我觉得保留一份原始数据是必要的,至于汇总是否一定要从历史表里面查,还是看需求决定,碰到新的汇总需求,不得不看原始数据的话,有有办法对应,否则就真的束手无策了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics