首页 > 其他 > 详细

文件计算的并行分组汇总

时间:2015-09-19 02:07:39      阅读:226      评论:0      收藏:0      [点我收藏+]

? ?在前文中我们介绍了文件并行的查找与过滤的实现方法,这里再介绍一下查找过滤加分组汇总的做法。和上一篇一样,这里只讨论小结果集,也就是计算结果在内存中可以装下的情况。

???????? 用多线程实现查找过滤和分组汇总的思路是:采用多线程方式,每个线程处理一部分数据的查找过滤和分组汇总,最后将每一部分检索的结果合并分组汇总,再在主程序中完成最终的过滤。这里通过一个例子来看一下具体做法。

考虑到大数据一般都存储在文件中,这里也以Orders.b文件为例,数据如下:

? ? ? ?ORDERID CLIENT???? SELLERID AMOUNT ORDERDATE NOTE

? ?1?????? 287? 47???? 5825???????? 2013-05-31?????? gafcaghafdgie f ci…

? ?2?????? 89???? 22???? 8681???????? 2013-05-04?????? gafcaghafdgie f ci…

? ?3?????? 47???? 67???? 7702???????? 2009-11-22?????? gafcaghafdgie f ci…

? ?4?????? 76???? 85???? 8717???????? 2011-12-13?????? gafcaghafdgie f ci…

? ?5?????? 307? 81???? 8003???????? 2008-06-01?????? gafcaghafdgie f ci…

? ?6?????? 366? 39???? 6948???????? 2009-09-25?????? gafcaghafdgie f ci…

? ?7?????? 295? 8?????? 1419???????? 2013-11-11?????? gafcaghafdgie f ci…

? ?8?????? 496? 35???? 6018???????? 2011-02-18?????? gafcaghafdgie f ci…

? ?9?????? 273? 37???? 9255???????? 2011-05-04?????? gafcaghafdgie f ci…

? ?10???? 212? 0?????? 2155???????? 2009-03-22?????? gafcaghafdgie f ci…

? ?

???????? 说明:数据中note字段是为了增加每条记录的长度设置的字段,没有实际意义。

需要将2013年的订单记录按照client,sellerid 分组,并求订单数量count(orderid)和订单金额sum(amount)。最后,按照订单金额大于500000的条件过滤结果。

?

由于Orders.b的数据量较大,所以分成若干段并行处理。首先,要使用集算器来编写脚本group.dfx,实现多线程计算,具体脚本如下:? ?


bubuko.com,布布扣
?

? ?A1:并行汇总线程数为4

? ?A2:通过fork关键字,使用多线程执行B2B5的代码,线程数是4,每个线程读取到的A2值分别是1234

? ?B2:利用游标cursor函数,将文件大致分成4组,取其中第A2组的游标(只取需要的字段)。

? ?B3:按照年份=2013年查找过滤。

? ?B4:对游标进行分组汇总。

? ?B5:返回本线程的分组结果B4

? ?A6:在主线程中把四个线程的返回结果合并。

? ?A7:对合并之后的结果再做一次分组汇总。

? ?A8:按照订单金额大于500000过滤分组之后的结果。

? ?A8,向外部程序返回最终汇总结果。

集算器脚本完成之后保存为group.dfx,在外部程序中通过集算器JDBC调用group.dfx的方法参见集算器的教程。

采用集算器多线程查找过滤方案的性能测试数据,可参见集算器文件遍历计算的性能测试?

文件计算的并行分组汇总

原文:http://datamachine.iteye.com/blog/2244416

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!