论坛首页 Java企业应用论坛

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

浏览 18928 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-01-08  
导入到HADOOP,再用PIG统计。
0 请登录后投票
   发表时间:2015-01-08  
谢谢大家的回帖。。昨天比较忙。没来的及回复
0 请登录后投票
   发表时间:2015-01-08  
一个java程序员 写道
这跟我做的一模一样,大数据汇总。  用的mysql, 也没什么办法。


直接内存汇总的。


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

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


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



根据表中四个字段(c1,c2,c3,c4)汇总 ,无论怎么做  这个汇总条件 查出的数据 都非常的大。 好像也没什么好方法。


这么多数据内存放不下的吧。。jvm Linux上最多支持不超过3g的内存。。而且数据库的数据的大小。。封装成对象后 size 远远比数据库中的数据大。。

能不能说下你的思路


0 请登录后投票
   发表时间:2015-01-08  
LinApex 写道
可以读取数据生成小数据文件,放在硬盘里,然后使用排序算法,hash切割,计算总额。


也是种思路哈。。。能具体点么? 谢谢
0 请登录后投票
   发表时间:2015-01-08  
red008 写道
我理解每天4千多万条数据不是瞬间过来的。比如应该每天白天工作时间过来的数据,每个小时几百万。这样的话,汇总必须要等所有数据都过来之后进行才有意义。

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

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

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

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

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

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

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

这个方案是根据你说的需求想的,估计你实际中有很多限制,不过我觉得应该是这个思路走下去。


汇总结果表我们是有的。。所以不需要历史表。。再说这么多数据放到同一张表中。mysql是吃不消的。。一张表的数据太大。跑起来会影响整个库的性能。。

数据的话肯定是所有都到达了。。我们是第二天凌晨跑前一天到达的所有数据。。对这么数据做汇总。。

再者单纯的写sql 对于分库分表的 系统是否合适?。。。

插入时减少索引倒是可以优化的。。

现在因为要向源数据表回写状态。 边写边读还真会发生死锁现象。。这个也是比较困惑的。。

或者真的要尝试下 map / reduce 了

0 请登录后投票
   发表时间:2015-01-08  
handong890 写道
你每次汇总一定要重头到尾计算一次?不能累加么? 建一张汇总记录表不就完了?几十亿的数据 都这样过来了



是可以累加。。关键是如何累加。。一条一条去数据表中累加么。。这样速度会不会很忙。

在内存中累加是最快的方法, 但结果集内存放的下么。。。
0 请登录后投票
   发表时间:2015-01-08  
引用
汇总结果表我们是有的。。所以不需要历史表。。再说这么多数据放到同一张表中。mysql是吃不消的。。一张表的数据太大。跑起来会影响整个库的性能。。

数据的话肯定是所有都到达了。。我们是第二天凌晨跑前一天到达的所有数据。。对这么数据做汇总。。

再者单纯的写sql 对于分库分表的 系统是否合适?。。。

插入时减少索引倒是可以优化的。。

现在因为要向源数据表回写状态。 边写边读还真会发生死锁现象。。这个也是比较困惑的。。

或者真的要尝试下 map / reduce 了


没听说过一个表数据量大影响数据库别的表操作性能的,顶多影响这一个表相关操作,除了汇总,你不会操作历史表,所以对你别的操作是完全没影响的(我们现在库里面有一个表里面有几亿条数据,完全没影响)。

如果有了历史表,你操作的就是单表的查询,和分库分表完全没关系了。

有了历史表,你的回写和汇总完全分离,不会发生死锁的。

另外,历史表的最重要的作用是,应对未来未知的任意汇总需求的变更,以及可以有机会检查你汇总的结果是否正确。

map/reduce对于你这种数据量是杀鸡用牛刀了。。。起码要几个T的数据量再去考虑吧。
0 请登录后投票
   发表时间:2015-01-08  
可以参考map/reduce思路,只不过自己用程序实现罢了;
1. 先导出数据;
2. 拆分数据:拆分到你内存可以容纳的量,比如按照uid进行拆分,拆分N份,每份的量根据你的硬件资源决定;
3. 分块计算;
4. 合并结果;
5. 结果导入数据库;
0 请登录后投票
   发表时间:2015-01-09  
paulwong 写道
导入到HADOOP,再用PIG统计。

和我考虑的一样,只不过二者现在都不熟悉,能否指点下?
0 请登录后投票
   发表时间:2015-01-09  
red008 写道
我理解每天4千多万条数据不是瞬间过来的。比如应该每天白天工作时间过来的数据,每个小时几百万。这样的话,汇总必须要等所有数据都过来之后进行才有意义。

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

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

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

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

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

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

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

这个方案是根据你说的需求想的,估计你实际中有很多限制,不过我觉得应该是这个思路走下去。


这位兄台提到建议感觉比较切合实际。

基于分步计算的话,其实汇总的过程可以在分表里进行一次,结果再合并后再次进行汇总。
比如可以对表1-n按照你需要的方式进行分组汇总,之后每几个表合并后分别再次汇总,以此类推。
就是不知道你汇总后能够缩减的数据量能够达到多少。
0 请登录后投票
论坛首页 Java企业应用版

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